У меня есть метод, который предполагает взять параметр поиска и удалить все из списка, который не соответствует параметру. Но когда он запускается, он удаляет элементы списка почти случайным образом. Я отлаживал его, и он правильно определяет, нужно ли удалять элемент, но он не удаляет правильный. Я думаю, что это как-то связано с тем, когда я удаляю один элемент, он испортил индексы остальной части списка, что не связано с моим методом отслеживания индекса. Я опубликовал весь класс, но соответствующий код находится в нижней части
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])
Думаю, вы уже знаете проблему. Когда вы удаляете элемент, изменяется индекс для остальных элементов. Например, если вы удалите 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 он маскирует встроенную функцию с тем же именем.
Когда вы удаляете элемент, все под ним движется вверх, вызывая изменение индекса всех следующих элементов. Простейшим решением этой проблемы (она также распространена при удалении слов из текстового виджета) является удаление назад, начиная с конца.
continue
сообщает Python перейти к следующей итерации циклаfor-loop
. См. Docs.python.org/tutorial/… .