Tkinter Listbox неправильно удаляет элементы - PullRequest
1 голос
/ 21 февраля 2011

У меня есть метод, который предполагает взять параметр поиска и удалить из списка все, что не соответствует параметру.Но когда он запускается, он удаляет элементы списка практически случайно.Я отладил его, и он правильно определяет необходимость удаления элемента, но не удаляет нужный.Я думаю, что это связано с тем, что когда я удаляю один элемент, он портит индексы остальной части списка, что не соответствует моему методу отслеживания индекса.Я написал весь класс, но соответствующий код находится внизу

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 ]

3 голосов
/ 21 февраля 2011

Когда вы удаляете элемент, все, что находится под ним, перемещается вверх, что приводит к изменению индекса всех следующих элементов. Самое простое решение проблемы такого рода (это также часто происходит при удалении слов из текстового виджета) - это удалить назад, начиная с конца.

2 голосов
/ 21 февраля 2011

Я думаю, вы уже знаете проблему. Когда вы удаляете элемент, индекс для остальных элементов изменяется. Например, если вы удалите 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 он маскирует встроенную функцию с тем же именем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...