TkInter菜单导致程序无法运行

时间:2015-06-17 03:04:45

标签: python tkinter

我正在尝试使用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

当我删除菜单栏的代码时,只需用一个简单的按钮替换它,应用程序就可以正常运行。可能导致问题的原因是什么?

1 个答案:

答案 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),就像您已经在做的那样。