我有一个方法,假设采用搜索参数并从列表中删除不符合参数的所有内容。但是当它运行时,它几乎随机删除列表项。我调试了它,它正确地确定是否需要删除一个项目,但它不会删除正确的项目。我认为它与删除一个项目有关,它会混淆列表其余部分的索引,这与我跟踪索引的方法无关。 我发布了全班,但相关的代码是在底部
class StudentFinderWindow(Tkinter.Toplevel):
def __init__(self):
Tkinter.Toplevel.__init__(self) # Create Window
##### 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)
# search results initial updater
self.getStudentList()
for student in self.studentList:
self.searchResults.insert(Tkinter.END, student)
##### event handler
self.searchRepositoryEntry.bind('<KeyRelease>', self.updateSearch)
这是相关代码
def updateSearch(self, event):
parameters = self.searchRepositoryEntry.get()
int = 0
currentList = self.searchResults.get(0, Tkinter.END)
length = len(parameters)
print(parameters)
print(length)
for i in currentList:
if not i[0:length] == parameters:
self.searchResults.delete(int)
print(i[0:length] == parameters)
print(i[0:length])
print(int)
int += 1
def getStudentList(self):
global fileDirectory # gets the directory that all the files are in
fileList = listdir(fileDirectory) # makes a list of files from the directory
self.studentList = [] # makes a new list
for file in fileList: # for loop that adds each item from the file list to the student list
self.studentList.append(file[:-4])
答案 0 :(得分:3)
当您删除某个项目时,其下方的所有内容都会向上移动,从而导致所有后续项目的索引发生变化。这种问题的最简单解决方案(从文本小部件中删除单词时也很常见)是从最后开始向后删除。
答案 1 :(得分:2)
我想你已经知道了这个问题。删除项目时,其余项目的索引会更改。例如,如果删除第4项,则第5项将成为“新”第4项。因此,每当删除项目时,您都不希望增加int
。您可以使用continue
实现该功能:
for i in currentList:
if not i[0:length] == parameters:
self.searchResults.delete(int)
continue # <-- Use continue so `int` does not increment.
int += 1
PS。使用int
作为变量名称并不是一种好的编码风格 - 在Python中它掩盖了同名的内置函数。