我正在尝试使用TkInter编写一个简单的文本编辑器。我想让它像其他文本编辑器一样有一个菜单栏,你可以保存,打开另一个文件等等。
但是,每当我尝试将菜单栏添加到我的班级时,程序就会启动,挂起大约半秒钟,然后退出。我不知道为什么会这样,或者如何调试它。这是我的代码。
#!/usr/bin/env python3
import functools
from tkinter import *
class mainWindow(Tk):
def initiate(self):
menuBarFrame = Frame(self).pack(side=TOP)
menubar = Menu(menuBarFrame)
menubar.add_command(label='Exit', command=quit())
root.config(menu=menubar)
mainloop()
win = mainWindow().initiate()
我尝试将.pack()
添加到该行
menubar = Menu(menuBarFrame)
但它给了我以下追溯:
File "XML.py", line 14, in <module>
win = mainWindow().initiate()
File "XML.py", line 9, in initiate
menubar = Menu(menuBarFrame).pack()
File "/usr/lib/python3.4/tkinter/__init__.py", line 1977, in pack_configure
+ self._options(cnf, kw))
_tkinter.TclError: can't pack ".140664986043280": it's a top-level window
当我删除菜单栏的代码时,只需用一个简单的按钮替换它,应用程序就可以正常运行。可能导致问题的原因是什么?
答案 0 :(得分:1)
菜单需要是根窗口的子窗口,而不是框架的子窗口。你根本不需要MenuBarFrame
。
另外,请看一下这一行:
menubar.add_command(label='Exit', command=quit())
您正在指示Tkinter立即调用quit()
函数,并将结果分配给菜单命令的command
属性。我猜测quit()
实际上是退出而不是返回对其他函数的引用。您需要将其更改为:
menubar.add_command(label='Exit', command=quit)
当然,另一个明显的问题是你实际上并没有在任何地方定义root
。
您绝对不想在pack()
的实例上致电Menu
。将菜单附加到窗口的正确方法是使用root.config(menu=menubar)
,就像您已经在做的那样。