Tkinter Listbox неправильно удаляет элементы

1

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

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])
Теги:
tkinter
listbox

2 ответа

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 он маскирует встроенную функцию с тем же именем.

  • 0
    спасибо, я понял, что это проблема, но не знал, что делать. Я добавил продолжить (хотя не совсем уверен, что он делает). Я также изменил Int. Я новичок в Python и не знаю всех соглашений
  • 0
    @Brandon: ключевое слово continue сообщает Python перейти к следующей итерации цикла for-loop . См. Docs.python.org/tutorial/… .
2

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню