2017-10-31 7 views
0

クラス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

問題はtkinterメソッドを継承することではなく、これはtkinterの問題でもありません。

上記コードset_stateは、の下に、__init__の下にあります。だからあなたは__init__の範囲外では使用できません。あなたがクラスのメソッドとしてset_stateを使用したい場合;

  1. それは__init__と同じレベルで定義されている ようにするには、まず自分のset_stateにインデントを逆にしなければなりません。
  2. ""の名前に変更する必要があります。 これは変数ではなく、クラス属性 material_menuです。合計で9の名前を変更する必要があります。

コードは正確に次のようになります。

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() 
+0

は感謝しています。できます!! –

関連する問題