如何从menu / menubutton继承网格

时间:2017-10-31 06:24:20

标签: python tkinter

我希望课程material_menu继承Menubutton方法gridgrid_forget,以便我可以展示或隐藏小部件。我不知道我应该继承哪个类以及如何修改函数set_state。请帮忙,提出一些例子。

from tkinter import *
from tkinter import ttk

class material_menu():
def __init__(self, name):
    menubutton = ttk.Menubutton(text=name)
    menubutton.menu = Menu(menubutton)
    menubutton["menu"] = menubutton.menu
    dict = {}
    for sheet_name in ["Menu A", "Menu B", "MenuC"]:
        dict[sheet_name] = Menu(menubutton.menu)
        menubutton.menu.add_cascade(label=sheet_name, menu=dict[sheet_name])
        for material in ["item1", "item2", "item3"]:
            dict[sheet_name].add_command(label=material, command=lambda sheet_name=sheet_name, material=material: test(sheet_name, material))

    def set_state(self, state, row):
        if state==0:
            menubutton.grid_forget()
        else:
            menubutton.grid(column=0, row=row, sticky=(N, S, E, W))

def test(sheet_name, material):
    print(sheet_name)
    print(material)

if __name__ == "__main__":
    win = Tk()
    a=material_menu("Menubutton")
    a.set_state(1, 0)
    win.mainloop()

1 个答案:

答案 0 :(得分:1)

你的问题不在于继承tkinter方法,这也不是tkinter的问题。

在上面的代码中,set_state__init__下的函数。这就是为什么你不能在__init__范围之外使用它的原因。如果您想使用set_state作为material_menu类的方法;

  1. 您必须首先撤消set_state中的缩进 它的定义与__init__相同。
  2. 然后,您需要将“menubutton”重命名为“self.menubutton” 它不再是一个变量,而是一个类的属性 material_menu。你应该总共重命名9个。
  3. 您的代码应该完全像:

    from tkinter import *
    from tkinter import ttk
    
    class material_menu():
        def __init__(self, name):
            self.menubutton = ttk.Menubutton(text=name)
            self.menubutton.menu = Menu(self.menubutton)
            self.menubutton["menu"] = self.menubutton.menu
            dict = {}
            for sheet_name in ["Menu A", "Menu B", "MenuC"]:
                dict[sheet_name] = Menu(self.menubutton.menu)
                self.menubutton.menu.add_cascade(label=sheet_name, menu=dict[sheet_name])
                for material in ["item1", "item2", "item3"]:
                    dict[sheet_name].add_command(label=material, command=lambda sheet_name=sheet_name, material=material: test(sheet_name, material))
    
        def set_state(self, state, row):
            if state==0:
                self.menubutton.grid_forget()
            else:
                self.menubutton.grid(column=0, row=row, sticky=(N, S, E, W))
    
    def test(sheet_name, material):
        print(sheet_name)
        print(material)
    
    if __name__ == "__main__":
        win = Tk()
        a=material_menu("Menubutton")
        a.set_state(1, 0)
        win.mainloop()