Précédent   Forum du club des développeurs et IT Pro > Autres langages > Python & Zope
Python & Zope Forum d'entraide sur la programmation en Python et Zope. Avant de poster -> F.A.Q Python
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 12/12/2012, 20h17   #1
MilkyMars
Invité régulier
 
Homme
Étudiant
Inscription : août 2012
Messages : 12
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2012
Messages : 12
Points : 5
Points : 5
Par défaut Execfile() et jeu du pendu

Bonjour,

Je viens vous demandez votre aide car je bloque sur un exercice depuis 2 jours, malgré mes recherches sur de nombreux forums et de la doc je ne m'en sors pas.

Voici mon code : http://dpaste.com/hold/844821/

Le problème que je rencontre c'est le bouton "Start" qui ne fait pas ce qu'il est sensé faire (c'est à dire relancer une partie).

Je sais que je dois utiliser la fonction execfile() pour ça (je n'ai pas le choix donc ce doit être possible avec).

Le code tel quel déclenche une erreur à l’exécution de la fonction reset(), à cause de top.destroy()
Code :
_tkinter.TclError: can't invoke "destroy" command:  application has been destroyed
En supprimant la ligne qui pose problème j'obtiens alors l'erreur ci :
Code :
RuntimeError: maximum recursion depth exceeded
Je ne m'attend pas à ce qu'on me serve la solution sur un plateau mais si quelqu'un peut me mettre sur la piste... Car là je suis coincé et ne peux pas avancé tant que ce bouton ne fonctionnera pas correctement.

Merci d'avance
MilkyMars est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2012, 20h43   #2
VinsS
Membre Expert
 
Homme
Inscription : octobre 2008
Messages : 939
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : octobre 2008
Messages : 939
Points : 1 406
Points : 1 406
Enlève les parenthèses de reset

Code :
1
2
 
Button(top, text='start', command=reset).pack(side=TOP)
__________________
Vincent
Oqapy . Qarte . PaQager
VinsS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2012, 01h09   #3
MilkyMars
Invité régulier
 
Homme
Étudiant
Inscription : août 2012
Messages : 12
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2012
Messages : 12
Points : 5
Points : 5
Merci beaucoup pour ta réponse VinsS.

En effet ça marche, mais seulement une fois. Le jeu se relance lorsque je clic sur le bouton "Start" mais lorsque je reclic dessus la fenêtre se ferme et j'obtiens la même erreur qu'avant :
Code :
_tkinter.TclError: can't invoke "destroy" command:  application has been destroyed
Peux-tu m'expliquer pourquoi le fait d'avoir retiré les parenthèses a permit de relancer le jeu (au moins une fois :p) ?
MilkyMars est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2012, 08h53   #4
VinsS
Membre Expert
 
Homme
Inscription : octobre 2008
Messages : 939
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : octobre 2008
Messages : 939
Points : 1 406
Points : 1 406
Du fait de la présence des parenthèses la fonction reset est appellée lors de l'instanciation du bouton, raison pour laquelle on ne met jamais ces parenthèses aux command et autres récepteurs de signaux.

Pour ton erreur actuelle, peut-être est-ce dû au fait que tu fait un destroy() après un quit(). Connais pas trop Tkinter.


Il n'empêche, détruire l'appli pour en relancer une nouvelle instance à partir d'elle-même est pour le moins saugrenu comme idée. Il serait plus simple de vider le canvas (clear() ?) et de recréer P.
__________________
Vincent
Oqapy . Qarte . PaQager
VinsS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2012, 14h24   #5
MilkyMars
Invité régulier
 
Homme
Étudiant
Inscription : août 2012
Messages : 12
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2012
Messages : 12
Points : 5
Points : 5
Merci pour l'explication, en effet j'avais essayé de mettre par exemple :
dans la fonction reset() et j'ai constaté que 'youpi!' s'affichait directement dans le terminal dès que je lançais l’exécution du script.

Je vais regarder pour l'erreur avec le destroy() et je te tiens au courant.

Merci encore, ça m'a déjà bien aidé, je ne savais même pas qu'il était possible d'appeler une fonction sans mettre de parenthèses.

EDIT : J'ai essayé en supprimant destroy() de la fonction reset() mais du coup la fenêtre n'est pas détruite et une autre s'ouvre, lorsque j'essaie de commencer le jeu en appuyant sur une touche j'ai l'erreur suivante :
Code :
1
2
3
  File "./pendu.py", line 31, in valide
    else: R += devine[x]
IndexError: string index out of range
Et si je laisse destroy() et que je supprime quit() j'obtiens la même erreur cependant il n'y a pas d'autre fenêtre générée.
MilkyMars est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2012, 16h56   #6
MilkyMars
Invité régulier
 
Homme
Étudiant
Inscription : août 2012
Messages : 12
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2012
Messages : 12
Points : 5
Points : 5
Si quelqu'un a une idée autrement qu'avec execfile() je vous écoute. Je suis bloqué depuis plusieurs jours, même si je ne fais pas comme demandé j'aimerais trouver une solution pour que cela marche.

Merci d'avance.
MilkyMars est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2012, 21h02   #7
wiztricks
Expert Confirmé Sénior
 
Inscription : juin 2008
Messages : 3 697
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 3 697
Points : 4 526
Points : 4 526
Salut,
Ecrivez execfile('pendu.py', {})
- W
__________________
Architectures Post-Modernes
wiztricks est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2012, 13h26   #8
MilkyMars
Invité régulier
 
Homme
Étudiant
Inscription : août 2012
Messages : 12
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2012
Messages : 12
Points : 5
Points : 5
Ça à l'air de marcher !!

Merci infiniment. J'ai cuisiné une petite fonction qui réinitialise tout et à la qui appelle execfile('pendu.py', {}) et ça marche.

Peux-tu m'expliquer pourquoi cela fonctionne avec les {} ?

Encore merci !!
MilkyMars est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2012, 14h18   #9
wiztricks
Expert Confirmé Sénior
 
Inscription : juin 2008
Messages : 3 697
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 3 697
Points : 4 526
Points : 4 526
Citation:
Envoyé par MilkyMars Voir le message
Peux-tu m'expliquer pourquoi cela fonctionne avec les {} ?
Le {} fait tomber le truc en marche.
Cà indique le problème mais ce n'est pas la solution.

Pourquoi cela fonctionne? Peux tu expliquer comment il t'est possible d'utiliser une fonction sans avoir pris la précaution d'apprendre à s'en servir? Essaie de chercher un peu.

- W
__________________
Architectures Post-Modernes
wiztricks est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 01h34.


 
 
 
 
Partenaires

Hébergement Web