You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 06:48:02