如何通过单次点击移除Tkinter Listbox的选中与焦点并切换到Entry组件
问题原因
Tkinter的<<ListboxSelect>>事件自带默认处理逻辑,会在用户绑定的回调函数执行完成后,自动恢复Listbox的选中状态,因此你在回调中写的selection_clear操作会被覆盖,无法达到预期效果。
修复方法
在fillout回调函数的最后添加return "break",即可终止事件的后续默认处理,原有逻辑就能正常生效。
修改后的fillout函数如下:
def fillout(e): my_entry.delete(0, END) my_entry.insert(0, my_list.get(ANCHOR)) my_list.selection_clear(0, END) my_entry.focus_set() my_entry.icursor(END) # 新增这行阻止默认事件处理 return "break"
完整可运行代码
from tkinter import * root = Tk() root.geometry("500x300") def update(data): # Clear the listbox my_list.delete(0, END) # Add toppings to listbox for item in data: my_list.insert(END, item) def fillout(e): my_entry.delete(0, END) my_entry.insert(0, my_list.get(ANCHOR)) my_list.selection_clear(0, END) my_entry.focus_set() my_entry.icursor(END) return "break" def check(e): typed = my_entry.get() if typed == '': data = toppings else: data = [] for item in toppings: if typed.lower() in item.lower(): data.append(item) update(data) my_label = Label(root, text="Start", fg="grey") my_label.pack(pady=20) my_entry = Entry(root) my_entry.pack() my_list = Listbox(root, width=50) my_list.pack(pady=40) toppings = ["Pepperoni", "Peppers", "Mushrooms", "Cheese", "Onions"] my_list.bind("<<ListboxSelect>>", fillout) my_entry.bind("<KeyRelease>", check) root.mainloop()
修改完成后运行测试:点击Listbox选项后,选中状态会立刻清空,焦点自动跳转到Entry输入框,光标定位到文本末尾,完全符合需求。
内容的提问来源于stack exchange,提问作者Jackie Ck
相关产品推荐
相关产品推荐

