[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. 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
    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. 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
          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. 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
              Hello.

              tu pourrais montrer l'appel à clOptionsNom et l'accès à .numNom de ton code ?
              0
              1. SVP, personne ne peut m'aider ?
                0