子类化tkinter.Menu会导致默认菜单

时间:2018-02-03 18:11:21

标签: python user-interface tkinter menu

我正在尝试创建一个tkinter GUI应用程序,同时将我的代码组织到主应用程序,框架和菜单的类中。对于菜单,我是tkinter.menu的子类,但它给了我一堆默认菜单,不包括我创建的菜单和命令。我尽可能地将它剥离到以下说明问题的工作示例:

首先,我将tkinter.TK子类化,以创建包含主窗口和菜单的主窗口小部件。为了说明,我在文件菜单中添加了一个空方法作为命令添加。接下来,我将tkinter.Frame子类化为创建主框架。为了说明,我在框架中添加了一个文本框。最后,我将tkinter.Menu子类化为创建主菜单并添加了子菜单" File"和命令"打开"。

import tkinter

class Application(tkinter.Tk):
    def __init__(self):
        tkinter.Tk.__init__(self)
        self.main = MainWindow(master=self)
        self.menu = MainMenu(master=self)

        self.main.pack(fill=tkinter.BOTH, expand=True)

    def open(self):
        pass

class MainWindow(tkinter.Frame):
    def __init__(self, master):
        tkinter.Frame.__init__(self)
        self.master = master
        self.textbox = tkinter.Text()
        self.textbox.pack(fill=tkinter.BOTH, expand=True)

class MainMenu(tkinter.Menu):
    def __init__(self, master=None):
        tkinter.Menu.__init__(self, master=None)
        self.master = master
        self.file = tkinter.Menu(self)
        self.add_cascade(label="File", menu=self.file)
        self.file.add_command(label="Open", command=master.open)

if __name__ == "__main__":
    Application().mainloop()

结果是我没有创建的一系列菜单,包括没有我的" Open"命令:

Here's a screen cap of the results.

我哪里错了?

1 个答案:

答案 0 :(得分:0)

替换:

self.menu = MainMenu(master=self)

使用:

self['menu'] = MainMenu(master=self)
    # or self["menu"] = MainMenu(master=self)
    # or self.config(menu=MainMenu(master=self))
    # or self.configure(menu=MainMenu(master=self))

或添加:

self['menu'] = self.menu
# or self["menu"] = self.menu
# or self.config(menu=self.menu)
# or self.configure(menu=self.menu)

之后的任何地方:

self.menu = ...

将您的菜单指定为 菜单到您的Toplevel小部件。