Tkinter网格管理器无法管理"顶级窗口"菜单

Art*_*ode 1 python tkinter python-3.x

所以我有一个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
Run Code Online (Sandbox Code Playgroud)

因此,很明显流程正在运行:__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)
Run Code Online (Sandbox Code Playgroud)

无论我把呼叫放在哪里,都会出现同样的错误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")
Run Code Online (Sandbox Code Playgroud)

Bry*_*ley 5

您不能在菜单上使用网格.Tkinter认为它们是顶级窗口,因为它们漂浮在其他窗口之上.

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

root = tk.Tk()
menubar = tk.Menu(root)
...
root.configure(menu=menubar)
Run Code Online (Sandbox Code Playgroud)