[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

  • Votes
  • Date
  • Date décroissante
  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 :)
    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)
      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.
        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
          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".
            1. Modérateur
              Hello.

              tu pourrais montrer l'appel à clOptionsNom et l'accès à .numNom de ton code ?