【发布时间】:2020-08-03 15:59:43
【问题描述】:
我正在尝试使用 StringVar 在 Tkinter 中制作自动完成 GUI(如 Google 的)。我定义了一个回调函数,在其中我使用了 StringVar.get(),我在 Entry 中的不同输入通过 ListBox 中的自动完成建议得到不同的输出。问题是,在 Entry 中输入一个字母后,我得到正确的输出,但在输入 2 个或更多字母后,我得到空的 ListBox。这是代码。
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() 的建议列表。
【问题讨论】:
-
我看到的一个直接问题(仍在深入研究代码)是使用
list作为参数名称。list是内置函数的名称(从技术上讲,是一个类)——使用它作为参数名称会产生意想不到的行为。 -
为了能够正确分析代码,您还应该包含函数
lexicographic_sort和binary_search的代码。 -
这是因为第一个字母的所有匹配项已从搜索列表中删除。尝试将
pom_list = list更改为pom_list = list[:]以使用搜索列表的副本。
标签: python tkinter autocomplete