【问题标题】:Tkinter grid manager can't manage 'top level window' menuTkinter 网格管理器无法管理“顶级窗口”菜单
【发布时间】:2014-09-07 00:50:26
【问题描述】:

所以我有一个 Python 3 和 Tkinter 应用程序。我目前正在尝试在弹出的窗口顶部添加一个菜单栏。创建它很好,但是一旦我尝试grid() 它,一切都变得混乱并抛出了这个错误:

[first line omitted]
File "C:\Users\Me\Documents\sync.py", line 13 in __init__
  self.createWidgets()
File "C:\Users\Me\Documents\sync.py", line 21, in createWidgets
  self.menubar.grid(column = 0, comlumnspan = 3)
File "C:\Program Files (x86)\Python34\lib\tkinter\__init__.py", line 2020, in grid_configure + self._options(cnf,kw))
_tkinter.TclError: can't manage ".41452544.49048880": it's a top-level window

因此,很明显流程正在运行:__init__ 调用 createWidgets 创建 self.menubar,添加子菜单,调用 self.menubar.grid

我不明白为什么 Tkinter 认为它被调用到网格的菜单栏是一个顶级窗口。 self.menubar.grid(),在跟踪中列出,显然是问题的原因而不是根窗口,所以它一定是这样想的。

这是有问题的代码:

def createWidgets(self):
    self.menubar = tk.Menu(self)
    self.menubar.grid(column = 0, columnspan = 3)

    SyncMenu = tk.Menu(self.menubar, tearoff = 0)
    SyncMenu.add_command(label = "Connect", command = self.Sync.Connect)
    SyncMenu.add_command(label = "Disconnect", command = self.Sync.Disconnect)

    FileMenu = tk.Menu(self.menubar, tearoff = 0)
    FileMenu.add_command(label = "Upload File", command = self.File.Upload)
    FileMenu.add_command(label = "Browse Online Files", command = self.File.Browse)

    self.menubar.add_cascade(label = "Sync", menu = SyncMenu)
    self.menubar.add_cascade(label = "File", menu = FileMenu)

无论我在哪里调用grid(),都会出现同样的错误。

这个问题的另一部分是我在 Python 3 和更新的 Tkinter 中,所以我没有tk.Tk()。相反,要初始化,我有这个:

class Application(tk.Frame):
    def __init__(self, master=None):
        tk.Frame.__init__(self,master)
        self.grid()
        self.createWidgets()
        self.master.geometry("500x500")

【问题讨论】:

  • 您不能在 Menu 实例上调用 grid。这很明显,因为菜单总是停留在菜单栏上。不需要grid
  • @TidB:那我该怎么办?
  • 不要使用grid,这里有一个关于菜单的教程:link
  • 那里取得了一些进展。但是,它现在正在创建一个包含菜单的新窗口。

标签: python python-3.x tkinter


【解决方案1】:

您不能在菜单上使用网格。 Tkinter 将它们视为顶级窗口,因为它们浮动在其他窗口之上。

创建传统菜单栏的常规方法是将其与根窗口的menu 属性相关联:

root = tk.Tk()
menubar = tk.Menu(root)
...
root.configure(menu=menubar)

【讨论】:

  • 好的,但问题是我在 python 3 和更新的 Tkinter 中,所以我根本没有使用 tk.Tk() 方法。
  • @ArtOfCode:没关系,tkinter 在两个版本的 python 中是相同的。无论您如何创建Tk 实例,这都是您创建菜单栏的方式。关键是,您为根窗口的menu 属性分配了一个菜单。
【解决方案2】:

我想通了。当我编辑问题以添加第二个代码块时,我注意到 self.master.geometry 行,我认为“那行影响主窗口,我不能使用它吗?”

答案是肯定的,所以找到根窗口的解决方案就是使用self.master,它是在我的__init__方法中通过对tk.Frame.__init__的超级调用定义的:

class Application(tk.Frame):
    def __init__(self, master=None):
        tk.Frame.__init__(self,master)    # This line defines self.master
        self.grid()
        self.createWidgets()
        self.master.geometry("500x500")   # This line uses it

所以现在让我的菜单栏进入正确窗口的解决方案是:

self.master["menu"] = self.menubar

在创建所有菜单和菜单项后的代码中。

【讨论】:

    猜你喜欢
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    • 2023-01-29
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多