2017-01-08 5 views
0

私は、tkinterにカスタムウィジェットを作成しようとしていました。それはあまりにも派手で、エントリーと2つのラベルを保持するフレームだけでした。私は、ラベルとフレームが親アプリケーションのStringVarsにアクセスできるようにします(つまり、両方のラベルのtextvariablesとtextvariableのエントリ)。私は、これは、キーワードargsとして初期化メソッドを介してこれらの名前を渡すことによって、これはかなり簡単になるはずだと思ったが、私は困っている。それはtk.Frameで初期化されるため、それがにのみたいtk.frame属性を思わ、tkinter:初期化パラメータをサブクラス化されたカスタムウィジェットに渡すか?

import tkinter as tk 
import tkinter.ttk as ttk 

class EntryFrame(tk.Frame): 
    def __init__(self, parent, *args, **kwargs): 
     tk.Frame.__init__(self, parent, *args, **kwargs) 

     self.title = kwargs.get('title') 
     title = tk.Label(self, text=self.title) 
     unit = tk.Label(self, text='(Unit)') 
     self.entryVar = tk.StringVar() 
     entry = tk.Entry(self, textvariable=self.entryVar) 

     title.grid(row=0, column=0, sticky='es') 
     unit.grid(row=0, column=1, sticky='ws') 
     entry.grid(row=1, column=0, columnspan=2, padx=3, pady=3, sticky='n') 

class TestApplication(tk.Frame): 
    def __init__(self, master=None, *args, **kwargs): 
     tk.Frame.__init__(self, master=None, *args, **kwargs) 
     self.master=master 
     self.grid(row=0, column=0) 

     entryFrame = EntryFrame(self, title='Title') 
     entryFrame.grid(row=0, column=0) 

root = tk.Tk() 
Application = TestApplication(root) 
root.mainloop() 

私は実際に私の新しいウィジェットに何かを渡すことができない問題に実行しているよ。ここに私のコードです開始時に。私は実際にそれにargsかkwargsを与えることはできません。

私は別のアプローチしようとした場合:

class EntryBox(self): 
    def __init__(self, parent, *args, **kwargs): 

     self.frame = tk.Frame(self) 
     self.title = tk.Label(self, text='Title') 
     self.unit = tk.Label(self, text='(Unit)') 
     self.entryVar = tk.StringVar() 
     entry = tk.Entry(self, textvariable=self.EntryVar) 

     title.grid(row=0, column=0, sticky='es') 
     unit.grid(row=0, column=1, sticky='es') 
     entry.grid(row=1, column=0, columnspan=2, padx=3, pady=3, sticky='n') 

をクラスは、自己定義されていないに関するエラーがスローされます。

EDIT:

コードサンプル2のより良い例:、言い換えれば

def __init__(self, parent, title, **kwargs):   
    tk.Frame.__init__(self, parent, **kwargs) 
    self.title = title 

スーパークラスにカスタムパラメータに渡すことを避ける:

class EntryBox(): 
    def __init__(self, parent, *args, **kwargs): 

     self.title=kwargs.pop('title') 
     self.frame = tk.Frame(parent) 
     self.frame.grid(row=0, column=0) 
     self.title = tk.Label(self.frame, text=self.title) 
     self.unit = tk.Label(self.frame, text='(Unit)') 
     self.entryVar = tk.StringVar() 


     self.entry = tk.Entry(self.frame) 

     self.title.grid(row=0, column=0, sticky='es') 
     self.unit.grid(row=0, column=1, sticky='es') 
     self.entry.grid(row=1, column=0, columnspan=2, padx=3, pady=3, sticky='n') 

答えて

1

のようなものを試してみてください。

または、スーパークラスの__init__を呼び出す前にself.title = kwargs.pop('title')を実行することができます。

あなたの2番目のコードサンプルは単純に混乱しています - class EntryBox(self):に、あなたは「自己」が何を期待していましたか?

+0

ええ、その2番目の例は、もう一度それを見て離れていた。私は調整し、上記のより良いバージョンを投稿しました。 tk.Frameから新しいクラスを継承しないと何か問題はありますか? – Platytude

+0

ウィジェットをサブクラス化する方が一般的です。実際のウィジェットを取得するためにインスタンス変数を掘り起こすことなく、子ウィジェットを直接追加したり、背景色のようなオプションを設定することができます。しかし、2番目のアプローチに根本的に間違ったことはありません。 – jasonharper

関連する問題