2017-12-16 18 views
0

モジュラークラスを作成しようとしています(いくつかのGUIボタン用)。 CoreButtonは、tkフレームを含む一般的なボタンのほとんどのメソッドで構成する必要があります。Python - Tkクラスの継承

ゴールはCoreButtonであり、そのフレームを使用して残りのボタンのGUIを構築する - それは表示されません。

任意のヘルプは

class CoreButton(ttk.Frame): 

    def __init__(self, master,nickname, hw_in=[], hw_out=[],ip_in='', ip_out='', sched_vector=[]): 
     ttk.Frame.__init__(self, master) 
     self.master = master 
     if ip_in == '': ip_in = ip_out # in case remote input is not defined 

     self.grid() 
    #####Rest of code 

と継承するクラスをにappriciatedされます。

class ToggleBut2(CoreButton): 
    def __init__(self, master, hw_in=[], hw_out=[],ip_in='', ip_out='', sched_vector=[]): 
     CoreButton.__init__(self, master, nickname="JOHM", hw_in=hw_in, hw_out=hw_out, ip_in=ip_in, ip_out=ip_out, sched_vector=sched_vector) 
     self.master = master 

    def build_gui(self, nickname='babe', height=3, width=13): 

     self.button = tk.Checkbutton(self, text=nickname, variable=self.but_var, indicatoron=0, height=height, width=width, command=self.sf_button_press) 
     self.button.grid(row=0, column=0) 
+1

それは 'self.grid'呼び出して再利用可能なコンポーネントを作成するために、悪い考えです - それは唯一の' grid'を使用し、親/マスターのウィジェットに再利用を制限します。 –

+2

'build_gui'と呼ばれる場所はどこにも表示されません。 –

+0

なぜ悪いアイデアであるのか説明できますか? –

答えて

2

私はあなたがやろうかわからないが、私は何か、私は

このようにするだろう self.grid()をクラス内で使用しないでください。外部クラスは tb1.pack()または tb1.grid()を使用できます。これは、ウィンドウで使用するレイアウトマネージャによって異なります。

__init__私はself.build_gui()を実行するので、手動で行う必要はありませんが、すべてのクラスは引数なしでself.build_gui()を作成する必要があります。

私はLabelを追加するだけでテスト用に - 「選択済み」/「選択なし」と表示されます。あなたはそれを必要としません。

import tkinter as tk 
from tkinter import ttk 

class CoreButton(ttk.Frame): 

    def __init__(self, master, nickname, hw_in=None, hw_out=None, ip_in=None, ip_out=None, sched_vector=None): 
     ttk.Frame.__init__(self, master) 

     self.nickname = nickname 

     self.hw_in = hw_in 
     if self.hw_in is None: 
      self.hw_in = [] 

     #self.hw_in = hw_in or [] 

     self.hw_out = hw_out 
     if self.hw_out is None: 
      self.hw_out = [] 

     #self.hw_out = hw_out or [] 

     self.ip_out = ip_out 
     self.ip_in = ip_in 
     if self.ip_in is None: 
      self.ip_in = self.ip_out # in case remote input is not defined 

     #self.ip_in = hw_in or self.ip_out 

     self.sched_vector = sched_vector 
     if sched_vector is None: 
      sched_vector = [] 

     #self.sched_vector = sched_vector or [] 

     self.build_gui() # <--- to build it automatically 

    def build_gui(self): 
     # you will overide it in child widgets 
     raise NotImplementedError('You have to override method build_gui()') 


class ToggleBut2(CoreButton): 

    def __init__(self, master, hw_in=None, hw_out=None, ip_in=None, ip_out=None, sched_vector=None, height=3, width=13): 

     self.height = height 
     self.width = width 

     # `self.but_var` is used in `build_gui` so it has to be created before `__init__` which executes `build_gui` 
     # or create it directly in `build_gui` 
     #self.but_var = tk.StringVar() 

     CoreButton.__init__(self, master, "JOHM", hw_in, hw_out, ip_in, ip_out, sched_vector) 


    def build_gui(self, nickname='babe'): 
     self.but_var = tk.IntVar() 

     self.button = tk.Checkbutton(self, text=self.nickname, variable=self.but_var, indicatoron=0, height=self.height, width=self.width, command=self.sf_button_press) 
     self.button.grid(row=0, column=0) 

     self.label = tk.Label(self, text='[not selected]') 
     self.label.grid(row=1, column=0) 


    def sf_button_press(self): 
     print(self.but_var.get()) 
     if self.but_var.get() == 0: 
      self.label['text'] = '[ not selected ]' 
     else: 
      self.label['text'] = '[ selected ]' 

# --- main --- 


root = tk.Tk() 

tb1 = ToggleBut2(root, height=1, width=10) 
tb1.pack() 

tb2 = ToggleBut2(root, height=3, width=30) 
tb2.pack() 

tb2 = ToggleBut2(root, height=5, width=50) 
tb2.pack() 

root.mainloop() 

enter image description here