Проблема с обработчиком событий Tkinter внутри класса - PullRequest
0 голосов
/ 15 февраля 2011

Моя проблема в том, что у меня есть класс, который создает объект верхнего класса Tkinter, а затем помещает в него поле, и я хочу добавить обработчик событий, который запускает метод (который также находится в классе) при каждом нажатии кнопкино когда вызывается событие, оно говорит:

AttributeError: экземпляр Toplevel не имеет атрибута '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 

прямо здесь

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

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

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

1 Ответ

1 голос
/ 15 февраля 2011

Судя только по отступу вашего примера, похоже, что updateSearch действительно не является частью определения класса.

Предполагая, что отступ является ошибкой разметки, и на основании сообщения об ошибке, о котором вы сообщаете, другая проблема заключается в том, что вы переопределяете self, поэтому self.updateSearch указывает на верхний уровень, а не на класс EditStudentWindow.Обратите внимание, что в сообщении говорится Toplevel instance has no attribute 'updateSearch' вместо EditStudentWindow instance...

Как правило, такие виджеты создаются с наследованием, а не с композицией.Вы можете рассмотреть возможность рефакторинга вашего кода, чтобы он выглядел примерно так:

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