如何解决StringVar.get()问题 [英] How to fix StringVar.get() issue
问题描述
我正在尝试使用StringVar在Tkinter中制作自动完成的GUI(例如Google的).我定义了一个回调函数,在其中我使用了StringVar.get(),其中对于Entry中的不同输入,我通过ListBox中的自动完成建议获得了不同的输出.问题是,在Entry中输入一个字母后,我得到正确的输出,但是在输入2个或更多后,我得到了空的ListBox.这是代码.
I am trying to make autocomplete GUI (like Google's) in Tkinter using StringVar. I defined a callback function , where i used StringVar.get(), where I for different input in Entry I get different output via autocomplete suggestions in ListBox. The problem is that after typing one letter in Entry I get right output but after typing 2 or more I get empty ListBox. Here's the code.
num=input()
num=int(num)
sv=StringVar()
def callback(sv,list,num):
a=sv.get()
pom_list = list
bin_list = []
lexicographic_sort(pom_list)
x = binary_search(a, pom_list)
while x != -1:
bin_list.append(x)
pom_list.remove(x)
x = binary_search(a, pom_list)
i = 0
l = Listbox(root, width=70)
l.grid(row=2, column=5)
if len(bin_list) == 0 or len(a) == 0:
l.delete(0, END)
else:
for list1 in bin_list:
if i == num:
break
l.insert(END, list1[0])
i += 1
sv.trace("w", lambda name, index, mode, sv=sv: callback(sv,list,num))
te = Entry(root, textvariable=sv)
te.grid(row=1,column=5)
其中,回调函数外部的list
是所有建议的列表,而bin_list
是使用binary_search的StringVar.get()的建议列表.
where list
outside callback function is a list of all suggestions, and bin_list
is a list of suggestions of StringVar.get() using binary_search.
推荐答案
这是因为所有与第一个字母匹配的项目都已从搜索列表中删除.您应该在callback()
中使用克隆的搜索列表.也不要创建新列表来显示结果列表,只创建一次结果列表并在callback()
中更新其内容.
此外,请事先对搜索列表进行排序:
It is because all matched items for the first letter have been removed from the search list. You should use a cloned search list in callback()
. Also don't create new list to show the result list, create the result list once and update its content in callback()
.
Furthermore, sort the search list beforehand:
def callback(sv, wordlist, num):
result.delete(0, END) # remove previous result
a = sv.get().strip()
if a:
pom_list = wordlist[:] # copy of search list
#lexicographic_sort(pom_list) # should sort the list beforehand
x = binary_search(a, pom_list)
while x != -1 and num > 0:
result.insert(END, x)
pom_list.remove(x)
num -= 1
x = binary_search(a, pom_list)
...
lexicographic_sort(wordlist)
sv = StringVar()
sv.trace("w", lambda *args, sv=sv: callback(sv, wordlist, num))
...
result = Listbox(root, width=70)
result.grid(row=2, column=5)
这篇关于如何解决StringVar.get()问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!