私は、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')
ええ、その2番目の例は、もう一度それを見て離れていた。私は調整し、上記のより良いバージョンを投稿しました。 tk.Frameから新しいクラスを継承しないと何か問題はありますか? – Platytude
ウィジェットをサブクラス化する方が一般的です。実際のウィジェットを取得するためにインスタンス変数を掘り起こすことなく、子ウィジェットを直接追加したり、背景色のようなオプションを設定することができます。しかし、2番目のアプローチに根本的に間違ったことはありません。 – jasonharper