Обновление переменной на шаг позади в поисковике списков в Tkinter - PullRequest
0 голосов
/ 18 февраля 2011

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

class StudentFinderWindow(Tkinter.Toplevel):

def __init__(self):
    Tkinter.Toplevel.__init__(self) # Create Window

    searchResultList = ['student1', 'student2', 'student3'] # Test list.

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

Заполняет список Tkinter оригинальным списком.

    # Search results initial updater.
    self.getStudentList()
    for student in self.studentList:
        self.searchResults.insert(Tkinter.END, student)

    ##### Event handler

Прямо здесь я запускаю средство обновления списка после ввода ключа в поле поиска

    self.searchRepositoryEntry.bind('<Key>', self.updateSearch)

Предполагается, что он запускается при каждом нажатии клавиши. Он получает строку, которая находится в Entry, затем начинает подсчет переменных, так что я знаю, по какому индексу это имя. После этого он запускает цикл for в текущем списке, предположительно проверяя, соответствует ли он требованиям параметров и любой другой буквы после него. Если он не совпадает, его следует удалить. Проблема в том, что когда я в первый раз нажимаю на букву, строка параметров - это просто пробел, а затем следующая буква - первая буква строки и так далее. Это всегда на шаг позади. И это проблема

def updateSearch(self, event):
    parameters = self.searchRepositoryEntry.get()
    int = 0
    currentList = self.searchResults.get(0, Tkinter.END)
    for i in currentList:
        if not i == parameters + '*':
            self.searchResults.delete(int)
        int += 1

def getStudentList(self):
    global fileDirectory # Gets the directory that all the files are in.
    fileList = listdir(fileDirectory)
    self.studentList = []
    for file in fileList:
        self.studentList.append(file[:-4])

1 Ответ

0 голосов
/ 23 февраля 2011

Я полагаю, что столкнулся с той же проблемой, которую вы описали ранее, когда пытался сделать функцию активного поиска ctrl-F в одной из моих программ.

То, что я нашел для работы, это не привязка к Key, а KeyRelease. Я не совсем уверен, почему это работает (вероятно, просто причуды с Tkinter). Тем не менее, это работает.

Отрывок'S:

Переплет

# self.FW.En is an entry widget.
self.FW.En.bind('<KeyRelease>', self.find)

Что бы запустить

def find (self, event):

        self.Te.tag_remove('found', '1.0', 'end')
        pat = self.FW.En.get()
        if len(pat) > 1:
            index = '1.0'
            while True:
                index = self.Te.search(pat, index, nocase=1, stopindex='end')
                if not index:
                    break
                lastidex = '%s+%dc' % (index, len(pat))
                self.Te.tag_add('found', index, lastidex)
                index = lastidex

            self.Te.tag_config('found', background='#80ff00')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...