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

Résolu
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

  1. SVP, personne ne peut m'aider ?
    0
    1. Modérateur
      Hello.

      tu pourrais montrer l'appel à clOptionsNom et l'accès à .numNom de ton code ?
      0
      1. 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
        1. Modérateur
          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
          1. 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
            1. Modérateur
              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
              1. 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