所以我有一个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")
您不能在菜单上使用网格。Tkinter认为它们是顶级窗口,因为它们漂浮在其他窗口之上。
创建传统菜单栏的通常方法是将其与menu
根窗口的属性关联:
root = tk.Tk()
menubar = tk.Menu(root)
...
root.configure(menu=menubar)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句