Tkinter如何将定义在Toplevel函数外的下拉菜单显示在顶层窗口
问题根源
你的代码执行顺序导致了下拉菜单默认绑定主窗口:
- 全局作用域创建
OptionMenu时,newWindow还是初始的空字符串,Tkinter 遇到无效的父组件参数时,会自动将组件绑定到当前的主窗口root - 后续点击按钮给
newWindow赋值为Toplevel实例时,OptionMenu的父组件属性已经固定,不会自动迁移到新窗口
解决方法
你不需要把所有变量都塞到函数内部,只要在Toplevel创建完成后,手动修改OptionMenu的父组件属性再重新布局即可,修改后的代码如下:
from tkinter import * newWindow = '' def openNewWindow(): global newWindow newWindow = Toplevel(root) # 新增:修改下拉菜单的父组件为新窗口,再重新布局 dropEvents.config(master=newWindow) dropEvents.grid(row = 0, column = 0) eventName = ["Lampada", "Trivia",] root = Tk() root.title("House Events") root.geometry("535x250") nextWindowButton = Button(root, text=">", command=openNewWindow) nextWindowButton.grid(row=1, column=0, pady=10) doneEvents = StringVar() # 这里先临时用root当父组件,避免无效参数警告 dropEvents = OptionMenu(root, doneEvents, *eventName) root.mainloop()
补充优化方案
如果不想先临时绑定root,也可以全局只做变量占位,把OptionMenu的初始化延迟到newWindow创建之后,依然满足变量定义在函数外部的要求:
from tkinter import * newWindow = '' dropEvents = None # 全局先占位声明变量 def openNewWindow(): global newWindow, dropEvents newWindow = Toplevel(root) # 新窗口创建后再初始化下拉菜单,父组件直接指定为newWindow dropEvents = OptionMenu(newWindow, doneEvents, *eventName) dropEvents.grid(row = 0, column = 0) eventName = ["Lampada", "Trivia",] root = Tk() root.title("House Events") root.geometry("535x250") nextWindowButton = Button(root, text=">", command=openNewWindow) nextWindowButton.grid(row=1, column=0, pady=10) doneEvents = StringVar() root.mainloop()
内容的提问来源于stack exchange,提问作者Harku
相关产品推荐
相关产品推荐

