Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 9 sur 9
  1. #1
    Invité de passage
    Homme Profil pro
    Étudiant
    Inscrit en
    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 : 4
    Points
    4

    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

  2. #2
    Expert Confirmé

    Homme Profil pro
    Inscrit en
    octobre 2008
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : octobre 2008
    Messages : 1 822
    Points : 2 517
    Points
    2 517

    Par défaut

    Enlève les parenthèses de reset

    Code :
    1
    2
     
    Button(top, text='start', command=reset).pack(side=TOP)
    Vincent
    Oqapy . Qarte . PaQager

  3. #3
    Invité de passage
    Homme Profil pro
    Étudiant
    Inscrit en
    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 : 4
    Points
    4

    Par défaut

    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) ?

  4. #4
    Expert Confirmé

    Homme Profil pro
    Inscrit en
    octobre 2008
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : octobre 2008
    Messages : 1 822
    Points : 2 517
    Points
    2 517

    Par défaut

    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

  5. #5
    Invité de passage
    Homme Profil pro
    Étudiant
    Inscrit en
    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 : 4
    Points
    4

    Par défaut

    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.

  6. #6
    Invité de passage
    Homme Profil pro
    Étudiant
    Inscrit en
    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 : 4
    Points
    4

    Par défaut

    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.

  7. #7
    Modérateur

    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    5 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 5 311
    Points : 7 401
    Points
    7 401

    Par défaut

    Salut,
    Ecrivez execfile('pendu.py', {})
    - W
    Architectures Post-Modernes

  8. #8
    Invité de passage
    Homme Profil pro
    Étudiant
    Inscrit en
    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 : 4
    Points
    4

    Par défaut

    Ç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 !!

  9. #9
    Modérateur

    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    5 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 5 311
    Points : 7 401
    Points
    7 401

    Par défaut

    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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •