变量在Tkinter的列表搜索器中后退一步

时间:2011-02-18 19:15:14

标签: python user-interface listbox tkinter

我正在尝试构建一个搜索引擎来检查列表,然后删除所有不符合搜索参数的列表项。我知道我的程序存在一些问题,例如当你退格时它不会把东西添加回列表中,而且在我的更新for循环中我简单地说'*'认为它只会从当前参数开始搜索字符串,但我稍后会越过那些桥梁。

class StudentFinderWindow(Tkinter.Toplevel):

def __init__(self):
    Tkinter.Toplevel.__init__(self) # Create Window

    searchResultList = ['student1', 'student2', 'student3'] # Test list.

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

    ##### 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
    self.searchRepositoryEntry = Tkinter.Entry(self)
    self.searchRepositoryEntry.grid(row=1, column=0)

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

这将使用原始列表填充Tkinter列表框。

    # Search results initial updater.
    self.getStudentList()
    for student in self.studentList:
        self.searchResults.insert(Tkinter.END, student)

    ##### Event handler

就在这里,我将绑定以在将密钥输入搜索框

后运行列表更新程序
    self.searchRepositoryEntry.bind('<Key>', self.updateSearch)

这应该在每次按下键时运行。它获取Entry中的字符串然后启动变量计数,因此我知道名称所在的索引。之后,它在当前列表上运行for循环,据说检查它是否符合参数的要求以及其后的任何其他字母。如果不匹配则应删除。问题是我第一次打字时参数字符串只是一个空格,然后是下一个字母,字符串是第一个字母,依此类推。它总是落后一步。这就是问题

def updateSearch(self, event):
    parameters = self.searchRepositoryEntry.get()
    int = 0
    currentList = self.searchResults.get(0, Tkinter.END)
    for i in currentList:
        if not i == parameters + '*':
            self.searchResults.delete(int)
        int += 1

def getStudentList(self):
    global fileDirectory # Gets the directory that all the files are in.
    fileList = listdir(fileDirectory)
    self.studentList = []
    for file in fileList:
        self.studentList.append(file[:-4])

1 个答案:

答案 0 :(得分:0)

我相信在尝试在我的某个程序中主动搜索ctrl-F功能时,我遇到了您之前描述过的同样问题。

我发现工作的不是Key上的绑定,而是KeyRelease。我不完全确定为什么会这样(可能只是与Tkinter的怪癖)。但是,它的工作原理。

片段的:

绑定

# self.FW.En is an entry widget.
self.FW.En.bind('<KeyRelease>', self.find)

哪个会运行

def find (self, event):

        self.Te.tag_remove('found', '1.0', 'end')
        pat = self.FW.En.get()
        if len(pat) > 1:
            index = '1.0'
            while True:
                index = self.Te.search(pat, index, nocase=1, stopindex='end')
                if not index:
                    break
                lastidex = '%s+%dc' % (index, len(pat))
                self.Te.tag_add('found', index, lastidex)
                index = lastidex

            self.Te.tag_config('found', background='#80ff00')