Tkinter列表框未正确删除项目

时间:2011-02-21 17:02:38

标签: python listbox tkinter

我有一个方法,假设采用搜索参数并从列表中删除不符合参数的所有内容。但是当它运行时,它几乎随机删除列表项。我调试了它,它正确地确定是否需要删除一个项目,但它不会删除正确的项目。我认为它与删除一个项目有关,它会混淆列表其余部分的索引,这与我跟踪索引的方法无关。 我发布了全班,但相关的代码是在底部

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])

2 个答案:

答案 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中它掩盖了同名的内置函数。