Tkinter网格管理器无法管理'顶层窗口'菜单

问题描述:

所以我有一个Python 3和Tkinter应用程序。我正在试图添加一个菜单栏到它弹出的窗口的顶部。这很好创建,但只要我尝试grid()它,这一切都变得不合时宜并给我这个错误:Tkinter网格管理器无法管理'顶层窗口'菜单

[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") 
+1

您无法在'Menu'实例上调用'grid'。这很明显,因为菜单总是停留在菜单栏上。不需要“网格”。 – TidB 2014-09-05 18:44:22

+0

@TB:所以我做什么呢? – ArtOfCode 2014-09-05 18:45:14

+0

不要使用'grid',这是一个关于菜单的教程:[link](http://www.tkdocs.com/tutorial/menus.html) – TidB 2014-09-05 18:48:54

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

正常的方式来创建一个传统的菜单栏是将其与根窗口的menu属性相关联:

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

好吧,但问题是我在python 3和更新的Tkinter,所以我根本不使用'tk.Tk()'方法。 – ArtOfCode 2014-09-06 16:37:51

+0

编辑以显示我所拥有的。 – ArtOfCode 2014-09-06 16:43:52

+0

@ArtOfCode:无关紧要,tkinter在两个版本的python中都是相同的。无论您如何创建'Tk'实例,这都是您创建菜单栏的方式。问题是,你将一个菜单分配给根窗口的'menu'属性。 – 2014-09-06 17:35:44

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

答案是肯定的,那么解决发现的根窗口只是使用self.master,这是在我的__init__方法所定义的supercall到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 

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