[Python] Problème d'attribut d'instance [Résolu/Fermé]

Signaler
Messages postés
303
Date d'inscription
lundi 30 janvier 2006
Statut
Membre
Dernière intervention
3 avril 2008
-
Messages postés
303
Date d'inscription
lundi 30 janvier 2006
Statut
Membre
Dernière intervention
3 avril 2008
-
Bonjour, je suis en train de faire une petite application, et je veux que l'on saisisse des paramètres via une boîte de dialogue. Il y a 2 joueurs, chacun ayant son nom stocké en variable d'instance sur la classe que j'ai construite.

Le problème c'est que quand j'essaie d'afficher la boîte de dialogue, Python me dis : " line 260, in body
if self.numNom == 1:
AttributeError: clOptionsNom instance has no attribute 'numNom' ". Cette ligne correspond au set.nom() selon les cas ... "num" vaut 1 ou 2, et renvoie au numéro du joueur. Enfin bref, je coince la ! Voila mon code
class clOptionsNom(Dialog) :
    def __init__(self,boss,num) :
        Dialog.__init__(self,boss)
        self.boss = boss
        self.numNom = num

    def body(self,master) :
        self.title("Changer nom du joueur")
        Label(master,text="Entrez le nom :").grid(row=0,column=0,sticky="w")
        self.nom = StringVar()
        Entry(master,width=15,textvariable=self.nom).grid(row=0, column=1, sticky="w")
        if self.numNom == 1:
            self.nom.set('Joueur 1')
        else:
            self.nom.set('Joueur 2')
--

T'as pensé à regarder sur Google avant de poser ta question ? 

7 réponses

Messages postés
303
Date d'inscription
lundi 30 janvier 2006
Statut
Membre
Dernière intervention
3 avril 2008
62
SVP, personne ne peut m'aider ?
Messages postés
32840
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 218
Hello.

tu pourrais montrer l'appel à clOptionsNom et l'accès à .numNom de ton code ?
Messages postés
303
Date d'inscription
lundi 30 janvier 2006
Statut
Membre
Dernière intervention
3 avril 2008
62
Merci sebsauvage :)

Donc j'ai un menu qui va appeller une fonction. Voila un bout du code pour le menu :
class MenuBar(Frame):
    "Barre de menus déroulants"
    def __init__(self,boss=None):
        Frame.__init__(self,borderwidth=2)

        ### Menu <Joueur1> ###
        self.joueur1 = Menubutton(self,text='Joueur 1')
        self.joueur1.pack(side=LEFT)
        me1 = Menu(self.joueur1)
        me1.add_command(label='Changer Nom',underline=8,command=boss.changeNom1)
        me1.add_command(label='Changer Couleur',underline=8,command=boss.changeCouleur1)
        self.joueur1.configure(menu=me1)
Et la fonction appellée est ici :
class Application(Frame):
# init de Frame + paramètrage

    def changeNom1(self):
        clOptionsNom(self,1)
Pour le moment il y a une fonction par joueur, mais je vais changer ça avec des expressions lambdas. Sauf que chaque chose en son temps, d'abord faire marcher correctement le truc de façon "simple".
Messages postés
32840
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 218
Tu l'importe de où ton "Dialog" ?

Parcque malgré un "from Tkinter import *", il me dit:
Traceback (most recent call last):
  File "a.py", line 3, in ?
    class clOptionsNom(Dialog) :
NameError: name 'Dialog' is not defined
Messages postés
303
Date d'inscription
lundi 30 janvier 2006
Statut
Membre
Dernière intervention
3 avril 2008
62
Ah oui pardon, rajoute ça from tkSimpleDialog import *

C'est un module de tk comme son nom l'indique qui fournit déja des petits widgets simples de validation/choix.
Messages postés
32840
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 218
Ah !

ça y est, j'ai compris.

Dans ta class, tu redéfinis la méthode body() de tkSimpleDialog


Or cette méthode body() est appellée lorsque tu appelle le constructeur Dialog.__init__(self,boss)
A ce moment là, self.numNom n'existe pas encore.

Il suffit donc de mettre ton self.numNom = num juste avant l'appel à Dialog.__init__(self,boss)
Messages postés
303
Date d'inscription
lundi 30 janvier 2006
Statut
Membre
Dernière intervention
3 avril 2008
62
Merciiiiiiiiii ! J'ai galéré pendant un temps pas possible, sans comprendre pourquoi ma variable d'instance n'était pas reconnue ! Merci beaucoup, j'aurais appris un truc important grâce à toi :)