ttk.Combobox下拉列表在新窗口激活后仍可见的问题
解决方案
问题分析
ttk.Combobox的下拉列表是独立的顶层窗口,默认不会随主窗口一同隐藏;同时主窗口的<FocusOut>事件需要正确绑定才能触发。
解决步骤
- 绑定主窗口的
<FocusOut>事件,在事件回调中关闭组合框的下拉列表。 - 使用
event_generate('<Escape>')模拟按下ESC键,触发ttk.Combobox内置的下拉列表关闭逻辑。
修改后的代码
import tkinter as tk import webbrowser from tkinter import ttk def on_root_focus_out(event): # 关闭Combobox的下拉列表 combo.event_generate('<Escape>') # 此处添加你需要的FocusOut事件处理逻辑 print("主窗口已失去焦点") root = tk.Tk() root.geometry("300x200") combo = ttk.Combobox(root, state="readonly") combo['values'] = ["Option 1", "Option 2", "Option 3"] combo.bind('<Button-1>', lambda event: root.after(2000, lambda: webbrowser.open("https://stackoverflow.com"))) combo.pack() # 绑定主窗口的FocusOut事件 root.bind('<FocusOut>', on_root_focus_out) root.mainloop()
说明
- 当浏览器窗口激活导致主窗口失去焦点时,
<FocusOut>事件触发,执行on_root_focus_out函数。 combo.event_generate('<Escape>')会强制关闭Combobox的下拉弹窗,确保它随主窗口一同隐藏。- 你可以在
on_root_focus_out函数中添加任何需要在主窗口失焦时执行的自定义代码。
内容的提问来源于stack exchange,提问作者Bill
相关产品推荐
相关产品推荐

