【问题标题】:TkInter Menubar causes program to not runTkInter 菜单栏导致程序无法运行
【发布时间】:2015-06-17 03:04:45
【问题描述】:

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

当我删除菜单栏的代码并用一个简单的按钮替换它时,应用程序可以正常工作并启动。什么可能导致问题?

【问题讨论】:

  • 您似乎遗漏了一些东西。您引用root 但从未定义它,您自己调用mainloop() 而不是tkinter 对象,win 不必要地保存None 等。你能提供一个MCVE 吗?跨度>
  • menuBarFrame 也是None,因为您存储的是pack() 方法的返回值,而不是Frame 对象接收器。

标签: python tkinter


【解决方案1】:

菜单必须是根窗口的子窗口,而不是框架的子窗口。你根本不需要MenuBarFrame

另外,看看这一行:

menubar.add_command(label='Exit', command=quit())

您正在指示 Tkinter 立即调用 quit() 函数,并将结果分配给菜单命令的 command 属性。我猜quit() 实际上是退出而不是返回对其他函数的引用。您需要将其更改为:

menubar.add_command(label='Exit', command=quit)

当然,另一个明显的问题是您实际上并没有在任何地方定义root

您绝对不想在Menu 的实例上调用pack()。将菜单附加到窗口的正确方法是使用root.config(menu=menubar),就像您已经在做的那样。

【讨论】:

    猜你喜欢
    • 2015-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多