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

Résolu
Darshu Messages postés 303 Statut Membre -  
Darshu Messages postés 303 Statut Membre -
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. Darshu Messages postés 303 Statut Membre 64
     
    SVP, personne ne peut m'aider ?
    0
  2. sebsauvage Messages postés 33284 Date d'inscription   Statut Modérateur Dernière intervention   15 684
     
    Hello.

    tu pourrais montrer l'appel à clOptionsNom et l'accès à .numNom de ton code ?
    0
  3. Darshu Messages postés 303 Statut Membre 64
     
    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
  4. sebsauvage Messages postés 33284 Date d'inscription   Statut Modérateur Dernière intervention   15 684
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Darshu Messages postés 303 Statut Membre 64
     
    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
  7. sebsauvage Messages postés 33284 Date d'inscription   Statut Modérateur Dernière intervention   15 684
     
    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
  8. Darshu Messages postés 303 Statut Membre 64
     
    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