在类中的Tkinter事件处理程序出现问题

时间:2011-02-15 17:50:13

标签: python class event-handling tkinter

我的问题是我有一个创建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 个答案:

答案 0 :(得分:1)

仅根据您的示例的缩进来判断,似乎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')
        ...