2011-02-15 4 views
0

Mon problème est que j'ai une classe qui crée un objet topclass Tkinter, puis y met un champ et je veux ajouter un gestionnaire d'événements qui exécute une méthode (qui est également dans la classe) à chaque fois qu'un bouton est pressé, mais lorsque l'événement est appelé ditProblème avec le gestionnaire d'événements Tkinter à l'intérieur d'une classe

AttributeError: Toplevel instance has no attribute 'updateSearch'

class EditStudentWindow(): 

def __init__(self): 

    searchResultList = ['student1', 'student2', 'student3'] # test list 

    ##### window attributes 

    # create window 
    self = Tkinter.Toplevel() 

    #window title 
    self.title('Edit Students') 

    ##### puts stuff into the window 

    # text 
    editStudentInfoLabel = Tkinter.Label(self,text='Select the student from the list below or search for one in the search box provided') 
    editStudentInfoLabel.grid(row=0, column=0) 

    # entry box 
    searchRepositoryEntry = Tkinter.Entry(self) 
    searchRepositoryEntry.grid(row=1, column=0) 

    # list box 
    searchResults = Tkinter.Listbox(self) 
    searchResults.grid(row=2, column=0) 

    ##### event handler 

right here

searchRepositoryEntry.bind('<Key>',command = self.updateSearch) 
    # search results 

    for result in searchResultList: 
     searchResults.insert(Tkinter.END, result) 

def updateSearch(self, event): 
    print('foo')  
+0

Que pensez-vous 'auto = Tkinter.Toplevel()' fait? – delnan

Répondre

1

a en juger uniquement sur l'empreinte de votre exemple, il semble que updateSearch est en effet pas partie de la classe defin Ition. En supposant que l'indentation est une erreur de balisage, et en fonction du message d'erreur que vous signalez, l'autre problème est que vous redéfinissez self, donc 'self.updateSearch' pointe vers le niveau supérieur plutôt que vers la classe EditStudentWindow. Notez que le message indique Toplevel instance has no attribute 'updateSearch' plutôt que EditStudentWindow instance...

Habituellement, de tels widgets sont créés avec l'héritage plutôt qu'avec la composition. Vous pouvez envisager refactorisation votre code pour ressembler à:

class EditStudentWindowClass(Tkinter.Toplevel): 
    def __init__(self, *args, **kwargs): 
     Tkinter.Toplevel.__init__(self, *args, **kwargs) 
     self.title('Edit Students') 
     ... 
+0

J'ai essayé d'ajouter l'héritage et il dit toujours toplevel n'a pas l'attribut et oui c'est une erreur de balisage j'ai vérifié et le code est en retrait – Brandon

+0

@Brandon: vous avez fait quelque chose de mal. J'ai coupé et collé votre code, l'ai changé pour faire l'héritage comme je l'ai suggéré en laissant un autre code tel quel (et en commentant correctement le 'self = Tkinter.Toplevel'), et créé correctement une fenêtre racine, et votre code fonctionne bien (Eh bien, j'ai aussi dû enlever le 'command =' dans votre liaison, ce qui me dit que ce code n'est pas votre code réel ou vous auriez eu des erreurs) –

+0

Désolé, quand j'ai ajouté l'héritage j'ai oublié d'ajouter le 'Tkinter. Toplevel .__ init __ (self) 'et ensuite l'erreur' command = 'est apparue tout fonctionne maintenant merci pour votre aide – Brandon

Questions connexes