IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Tkinter Python Discussion :

Problème avec Entry() avec un bouton Rejouer


Sujet :

Tkinter Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2021
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2021
    Messages : 19
    Points : 14
    Points
    14
    Par défaut Problème avec Entry() avec un bouton Rejouer
    Bonjour,
    j'essaye de faire un petit jeu qui consiste à deviner un nombre choisit au hasard.
    Il fonctionne très bien, par contre, si je le relance avec le bouton rejouer, il plante.
    En mettant des print un peu partout, j'ai vu que c'était au niveau de la ligne 31, self.reponse=Entry(root) que j'ai le problème.
    Pour simplifier je n'ai mis que le code qui donne la bonne réponse du premier coup.
    Si je joue la première fois, que je donne le bon chiffre et fait Valider, je voie bien ma variable reponse, ligne 21, qui retourne self.reponse.get()
    Ensuite si je fais Rejouer, la variable reponse est vide, et j'ai un message d'erreur !
    Je pensais qu'en instanciant une classe on la ré-initialisait, mais je dois passer à côté de quelque chose.
    Merdi d'avance de votre aide
    Cordialement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    # -*- coding: utf-8 -*-  
     
    from tkinter import *
    import random
    import tkinter.font as font
     
    class Jouer_Nombre:
     
        def __init__(self):
            self.NB_MAX=10
            self.NB_MIN=1
            self.reponse=None
            self.nombre=0
            self.affichage=None
     
        def repondre(self,affiche):
            self.affichage['text'] = affiche
            self.reponse.delete(0,END)
     
        def test(self):
            print('test reponse',self.reponse.get())
            if int(self.reponse.get())==self.nombre:
                self.repondre('GAGNE')
                self.reponse.delete(0,"end")
                return
     
        def jouer(self):
            self.nombre=random.randrange(self.NB_MIN,self.NB_MAX+1)
            print('nombre=',self.nombre)
            Label(root, text = 'Ton chiffre entre 1 et 10 :',width=20,height=10,font=helv10).grid(row=0,column=0)
            self.reponse=Entry(root)
            self.reponse.focus_set()#impose le focus 
            self.reponse.grid(row=0,column=1)
            self.affichage = Label(root, width=30,height=10,font=helv10)#affiche les réponses
            self.affichage.grid(row=3,columnspan=2,sticky='nsew')
     
    def rejouer():
        nombre=Jouer_Nombre()
        nombre.jouer()
     
    #-----------------Debut du programme------------------    
    if __name__ == "__main__":
        root = Tk()
        root.title('Trouve le nombre')
        helv10 = font.Font(family='Helvetica', size=10, weight='bold')
        nombre=Jouer_Nombre()
        Button(root, text ='Valider', command=nombre.test).grid(row=1,columnspan=2,sticky='nsew')
        Button(root, text ='Rejouer', command=rejouer).grid(row=4,column=0)
        Button(root, text ='Quitter', command=root.destroy).grid(row=4,column=1)
        nombre.jouer()
        root.mainloop()

  2. #2
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 938
    Points : 7 347
    Points
    7 347
    Par défaut
    Salut,

    Faire des classes pour des classes, sans savoir réellement son intérêt c'est compliqué.
    Je pense que dans cette histoire, tu dois avoir des problèmes liés à la portée de variables (au moins une).

    Pour faire simple, imaginons que tu es une classe représentant ta fenêtre, et dans ta méthode __init__, l'ensemble des widgets initialisés.

    Par la suite, toutes les actions liées à ta fenêtre et tes widgets sont représentées dans des méthodes.

    En partant de ton développement, on pourrait partir sur une base améliorable qui serait,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    from tkinter import *
    import random
    import tkinter.font as font
     
     
     
     
    class Window(Tk):
     
     
        def __init__(self):
            super().__init__()
            self.NB_MAX = 10
            self.NB_MIN = 1
            self.title('Trouve le nombre')
            self.helv10 = font.Font(family='Helvetica', size=10, weight='bold')
            Label(self, text='Ton chiffre entre 1 et 10 :', width=20,
                  height=10, font=self.helv10).grid(row=0, column=0)
            self.reponse = Entry(self)
            self.reponse.focus_set()  # impose le focus
            self.reponse.grid(row=0, column=1)
            Button(self, text='Valider', command=self.test).grid(
                row=1, columnspan=2, sticky='nsew')
            Button(self, text='Rejouer', command=self.jouer).grid(row=4, column=0)
            Button(self, text='Quitter', command=self.destroy).grid(row=4, column=1)
            self.affichage = Label(self, width=30, height=10,
                                   font=self.helv10)  # affiche les réponses
            self.affichage.grid(row=3, columnspan=2, sticky='nsew')
            self.nombre = random.randrange(self.NB_MIN, self.NB_MAX+1)
     
     
        def repondre(self, affiche):
            self.affichage['text'] = affiche
            self.reponse.delete(0, END)
     
     
        def test(self):
            if self.affichage["text"] != "GAGNE":
                print('test reponse', self.reponse.get())
                if int(self.reponse.get()) == self.nombre:
                    self.repondre('GAGNE')
                self.reponse.delete(0, "end")
            else:
                self.affichage["text"] = ""
     
     
        def jouer(self):
            self.affichage["text"] = ""
            self.nombre = random.randrange(self.NB_MIN, self.NB_MAX+1)
            print('nombre=', self.nombre)
     
     
     
     
    # -----------------Debut du programme------------------
    if __name__ == "__main__":
        root = Window()
        root.mainloop()

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 427
    Points : 37 009
    Points
    37 009
    Par défaut
    Salut,

    Dans rejouer, mettez la ligne 38 - nombre=Jouer_Nombre() - en commentaire.
    Normalement, ça devrait tomber en marche.

    Pour le reste, je ne vois pas l'intérêt de créer de nouveaux widgets à chaque appel à jouer.
    Et intuitivement, rejouer devrait être méthode de Jouer_Nombre qui se contente de remettre le programme dans un état cohérent pour relancer jouer.

    - W

  4. #4
    Membre à l'essai
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2021
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2021
    Messages : 19
    Points : 14
    Points
    14
    Par défaut Suite et fin
    En effet cela fonctionne. Je pensais naïvement qu'il fallait re_instancier une classe pour la re-initialiser
    Merci pour vos réponses ultra rapides

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 427
    Points : 37 009
    Points
    37 009
    Par défaut
    Citation Envoyé par PLUB_85 Voir le message
    En effet cela fonctionne. Je pensais naïvement qu'il fallait re_instancier une classe pour la re-initialiser
    Est ce que créer une nouvelle liste remet à zéro la liste précédente? ça crée une nouvelle liste vide... et toutes les variables qui ont une référence vers l'ancienne liste ne verront pas la nouvelle liste.

    - W

Discussions similaires

  1. Problème avec 2 boutons submit
    Par STB_Fk dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 16/11/2006, 11h23
  2. probléme avec un bouton recommencer
    Par mademoizel dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 07/06/2006, 18h27
  3. Problème avec un bouton TBitBtn
    Par kurul1 dans le forum C++Builder
    Réponses: 8
    Dernier message: 02/05/2006, 11h41
  4. Problème avec les boutons d'options
    Par Le Rebel dans le forum Langage
    Réponses: 3
    Dernier message: 07/02/2006, 13h12
  5. Problème avec les boutons de perl Tk
    Par jkevin2 dans le forum Interfaces Graphiques
    Réponses: 4
    Dernier message: 02/09/2005, 18h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo