如何使用Tkinter实现OptionMenu选中特定选项时弹出新窗口
原代码问题点
- 选中值判断逻辑写在全局作用域,仅会在程序初始化时运行一次,无法在每次下拉选项变更时触发
- 弹窗使用
Tk()实例化会创建多个主窗口,引发事件循环冲突,应该使用Toplevel创建子弹窗 - 选项变更后的业务逻辑没有放到绑定的
changed回调函数中,无法被trace触发执行
修改后完整代码
from tkinter import * # 主窗口初始化 root = Tk() root.title("主窗口") options = ["选项1", "选项2", "Particular Option", "选项3"] clicked = StringVar() clicked.set(options[0]) # 弹窗函数调整 def alert_popup(): # 用Toplevel创建子弹窗,不要重复实例化Tk() popup = Toplevel() popup.title("提示") sw = popup.winfo_screenwidth() sh = popup.winfo_screenheight() popup.geometry('%dx%d+%d+%d' % (sw//2, sh//2, sh//4, sw//4)) w = Label(popup, text="已选中指定选项", width=120, height=10) w.grid() b = Button(popup, text="OK", command=popup.destroy, width=10) b.grid() # 选项变更回调函数 def changed(*args): selected_val = clicked.get() print(selected_val) # 把判断逻辑放到回调内,每次值变动都会触发判断 if selected_val == "Particular Option": alert_popup() # 下拉菜单配置 drop = OptionMenu(root, clicked, *options) drop.grid(pady=10) # 绑定值变更监听 clicked.trace("w", changed) root.mainloop()
核心修改说明
- 把选中值的判断逻辑迁移到了
changed回调函数内,每次下拉选项变更都会触发判断 - 弹窗改用
Toplevel实现,避免多主窗口导致的异常 - 给回调函数加了
*args参数,适配trace触发时传入的默认参数,避免参数不匹配报错
内容的提问来源于stack exchange,提问作者Ishaan Joshi
相关产品推荐
相关产品推荐

