0

我有 Tkinter 的应用程序,例如:

from Tkinter import *
from ttk import *

class MyMenu(Menu):
    ....

class MyNotebook(Notebook):
    ....

tk=Tk()

f1=Frame(master=tk)
f2=Frame(master=tk)

menu=MyMenu(master=f1)

notebook=MyNotebook(master=f2)

我想添加commandmenu这将在notebook. 我怎样才能做到这一点?

PSf1 != f2这很重要!

PPS 函数,如commandsin中使用的menu可能在另一个文件中

4

2 回答 2

1

解决方案很简单:A 类的实例要与 B 类的实例交互,A 类需要对 B 类的实例的引用。这意味着您需要将其传递给构造函数,或者在创建后设置 if . 例如:

class MyMenu(Menu):
    def __init__(self, notebook):
        ...
        self.add_command("New page", command=notebook.add(...))
...
notebook = Notebook(...)
menu = MyMenu(notebook)

另一种方法——我认为更好——是传递有时称为控制器的东西——一个知道所有小部件的类,或者为小部件提供接口。例如,您可以将您的应用程序实现为一个类,并使用它的一个实例作为您的控制器:

class MyMenu(Menu)
    def __init__(self, app=None):
        ...
        self.add_command(..., command=app.add_tab)

class App(Tk):
    def __init__(self):
        ...
        self.menu = MyMenu(self, controller=self)
        self.notebook = Notebook(...)
        ...
    def add_tab(self, label):
        frame = Frame(self)
        self.notebook.add(frame, text=label)

app = App()
app.mainloop()
于 2013-05-27T22:09:43.263 回答
1

菜单不需要其中一个框架,因为它应该与窗口一起配置,而不是与几何管理器一起放置。与此类似的东西可以完成这项工作:

# ...
def add_tab():
    text = "Tab {}".format(len(notebook.tabs()))
    frame = Frame(notebook, width=100, height=100)
    notebook.add(frame, text=text)

menu=MyMenu()
menu.add_command(label="Add tab", command=add_tab)
tk.config(menu=menu)

但是,我建议您: a) 定义一个类而不是使用全局变量;b)不要使用import *,因为 Tkinter 一个 ttk 对不同的类使用相同的名称。它不仅更有条理,而且更易于阅读:

import Tkinter as tk
import ttk

class MyMenu(tk.Menu):
    pass

class MyNotebook(ttk.Notebook):
    pass

class App(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.frame = ttk.Frame(self)
        self.notebook = MyNotebook(self.frame)
        self.frame.pack()
        self.notebook.pack()
        self.add_tab()

        menu = MyMenu()
        menu.add_command(label="Add tab", command=self.add_tab)
        self.config(menu=menu)

    def add_tab(self):
        text = "Tab {}".format(len(self.notebook.tabs()))
        frame = ttk.Frame(self.notebook, width=100, height=100)
        self.notebook.add(frame, text=text)

app = App()
app.mainloop()
于 2013-05-27T21:05:34.477 回答