2017-11-06 9 views
1

は、私はこのクラスを使用するときに、コード柔軟性を可能にするために、それぞれ入力し、Buttonウィジェットのそれぞれにそれらの1 **kw_ent**kw_butを渡したい2つのTkinterのウィジェット、ttk.Entryttk.Button、とNewEntryという名前のクラスを考えてみましょう。Python - 2組の** kwargsを同じクラスに渡します。出来ますか?

しかし、以下のコードに示すように、2 kwargsを定義すると構文エラーが発生します(これは、このようにコード化すると非常に明白です)。

2 kwargsを渡す方法はありますか?

class NewEntry(ttk.Frame): 
    def __init__(self, master=None, **kw_ent, **kw_but): 
     ttk.Frame.__init__(self, master) 
     self.master = master 

     self.ent_var = tk.StringVar() 
     self.ent = ttk.Entry(self, textvariable=self.ent_var, **kw_ent) 
     self.ent.grid(row=0, column=0) 

     self.button = ttk.Button(self, text='Button', command=self.but_callback, **kw_but) 
     self.button.grid(row=0, column=1) 
     self.ent.bind('<FocusIn>', self.clear_ent) 

     self.init_vals() 

    def init_vals(self): 
     self.ent_var.set("Enter value") 
     self.ent['foreground'] = 'red' 

    def clear_ent(self, event): 
     self.ent_var.set('') 
     self.ent['foreground'] = '#4c4c4c' 

    def restore_ent(self, event): 
     self.init_vals() 

    def but_callback(self): 
     print(self.ent_var.get()) 
     sleep(1) 
     self.init_vals() 


root = tk.Tk() 
a = NewEntry(root, width=13) 
a.grid() 
root.mainloop() 
+5

どのようなキーワード引数が '** kw_ent'に属し、' ** kw_but'に属するのかをPythonはどのように決定しますか? 2つの別々の 'dict'オブジェクトを通常のパラメータとして渡すだけです:' kw_ent、kw_but'。 –

+0

私はこれがその特定の理由からそれを解決する方法ではないことを知っています。 –

+0

最初にもう1つのdictを '.update()'し、それを関数呼び出しに渡すことができます。 – Evert

答えて

4

2 kwargsからを渡す方法はありますか?

はい:非常に簡単です:**kwargs表記を使用しないでください。

class NewEntry(ttk.Frame): 
    def __init__(self, master=None, kw_ent=None, kw_but=None): 
     if kw_ent is None: 
      kw_ent = {} 
     if kw_but is None: 
      kw_but = {} 

     # your existsing code here 

あなたはもちろんNewEntryをinstanciatingとき、もう少し明確にする必要があります - a = NewEntry(root, width=13)で、widthはあなたが必要とするkw_entの一部になるはずだったと仮定:側として

a = NewEntry(root, kw_ent={"width":13}) 

を注:あなたは、 "ent"または "but"よりも読みやすい命名体系を考えたいと思うかもしれません - "entry"と "button"が頭に浮かんでいます...ショートは、暗黙の3文字の識別子があなたのコードどんな速い(しかし、彼らは確かにそれを読みにくくする)。

+1

ありがとうございます。 1)回帰表記 - これは一例であり、実際のコードの一部ではない(私の要点を作ることに過ぎない)、まだそれに感謝する。 2)他のコメントで示唆されているように、私はこれが解決方法であると理解しています –

関連する問題