2014-09-05 89 views
1

所以我有一個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

回答

5

您不能在菜單上使用網格。 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

0

我已經想通了。當我編輯問題添加第二個代碼塊時,我注意到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 

這是在創建所有的菜單和菜單項後的代碼。