我正在尝试构建一个搜索引擎来检查列表,然后删除所有不符合搜索参数的列表项。我知道我的程序存在一些问题,例如当你退格时它不会把东西添加回列表中,而且在我的更新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])
答案 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')