【发布时间】:2019-03-09 15:40:16
【问题描述】:
我正在尝试动态设置 Tkinter Combobox 的选项。我的代码几乎可以工作,但我不知道为什么。
该代码旨在允许在输入框中键入字符串。然后它在列表中搜索包含该字符串的任何项目。例如,如果你输入
米
进入输入框列表变成
['米奇','米妮']
所有这些都按预期工作。
每当使用函数触发<FocusIn> 时,应该更新组合框[values] 属性。这确实发生了,但只有在我单击组合框两次之后。我不确定为什么第一次单击它不会触发<FocusIn> 绑定。这是错误的绑定吗?我的 lambda 函数有什么不太正确的地方吗?希望得到一些帮助!
代码:
from tkinter import *
from tkinter import ttk
init_list = ['Mickey', 'Minnie', 'Donald', 'Pluto', 'Goofy']
def db_values():
i = inp_var.get()
db_list = [x for x in init_list if i in x]
print(db_list)
return db_list
def db_refresh(event):
db['values'] = db_values()
root = Tk()
title_label = Label(root, text="Partial string example")
title_label.grid(column=0, row=0)
inp_var = StringVar()
input_box = Entry(root, textvariable=inp_var)
input_box.grid(column=0, row=1)
name_selected = StringVar()
db = ttk.Combobox(root, textvariable=name_selected)
db['values'] = db_values()
db.bind('<FocusIn>', lambda event: db_refresh(event))
db.grid(column=0, row=2, sticky=EW, columnspan=3, padx=5, pady=2)
root.mainloop()
【问题讨论】:
-
无法重现您的问题。但是您的代码没有主入口点
if __name__ == "__main__":,这可能会导致意外行为。阅读Is this bad programming practice in tkinter? -
@stovfi 单击下拉箭头。第一次它不会正确显示列表。
-
更改为
db.bind('<Enter>', db_refresh),要求在单击下拉箭头之前移动Combobox上的指针。相关how-to-bind-keypress-event-for-combobox-drop-out-menu