[Python] Problème d'attribut d'instance

Résolu/Fermé
Darshu Messages postés 303 Date d'inscription lundi 30 janvier 2006 Statut Membre Dernière intervention 3 avril 2008 - 23 août 2006 à 10:33
Darshu Messages postés 303 Date d'inscription lundi 30 janvier 2006 Statut Membre Dernière intervention 3 avril 2008 - 24 août 2006 à 14:38
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

Darshu Messages postés 303 Date d'inscription lundi 30 janvier 2006 Statut Membre Dernière intervention 3 avril 2008 64
24 août 2006 à 09:27
SVP, personne ne peut m'aider ?
0
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
24 août 2006 à 11:09
Hello.

tu pourrais montrer l'appel à clOptionsNom et l'accès à .numNom de ton code ?
0
Darshu Messages postés 303 Date d'inscription lundi 30 janvier 2006 Statut Membre Dernière intervention 3 avril 2008 64
24 août 2006 à 13:46
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".
0
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
24 août 2006 à 14:00
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Darshu Messages postés 303 Date d'inscription lundi 30 janvier 2006 Statut Membre Dernière intervention 3 avril 2008 64
24 août 2006 à 14:26
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.
0
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
24 août 2006 à 14:32
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)
0
Darshu Messages postés 303 Date d'inscription lundi 30 janvier 2006 Statut Membre Dernière intervention 3 avril 2008 64
24 août 2006 à 14:38
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 :)
0