为什么 Tkinter 中的菜单会产生错误

why does the Menu in Tkinter produce an error

class Create(Tk):

    def __init__(self, parent, controller):

        tk.Frame.__init__(self, parent)

        self.menubar = Menu(master = self)
        self.menubar.add_command(label = "A", command= lambda: self.show_frame(A) )
        self.menubar.add_command(label = "B", command= lambda: self.show_frame(B) )
        self.menubar.add_command(label = "C", command= lambda: self.show_frame(C) )
        self.menubar.add_command(label = "D", command= lambda: self.show_frame(D) )

        self.config(menu=self.menubar)

global app
app = MainClass()
app.mainloop()  

作为参考:MainClass 做了很多事情,但它也调用了 Create,作为其中的一部分,我将提出几个框架来向用户展示,这一切都在没有菜单的情况下工作,但我不断收到错误消息:

self.tk.call(_flatten((self._w, cmd)) + self._options(cnf))_tkinter.TclError: unknown option "-menu"

我搜索了这个并发现了另一个堆栈溢出问题(链接如下),它说你需要让你的 class 从 Tk 而不是 Frame 继承,但是我仍然遇到这个错误。

我错过了什么? (我是运行python版本3.8.1)

Tkinter Unknown Option -menu

问题是您将 class Create 的实例传递给 Frame.__init__Create 继承自 Tk

尝试以下操作:

class Create(Tk):

    def __init__(self, parent, controller):

        Tk.__init__(self)

        self.menubar = Menu(master = self)
        self.menubar.add_command(label = "A", command= lambda: self.show_frame(A) )
        self.menubar.add_command(label = "B", command= lambda: self.show_frame(B) )
        self.menubar.add_command(label = "C", command= lambda: self.show_frame(C) )
        self.menubar.add_command(label = "D", command= lambda: self.show_frame(D) )

        self.config(menu=self.menubar)

这样做的缺点是,即使您正确继承了 Tk,2 windows 也会出现,而且 Menu 不会有 Frame小部件作为主人。