Tkinterでは、私は左マウスボタンに結合された複数のウィジェットを持っています。クリックしたときに同じイベントが発生します。イベントをトリガーしたウィジェットを取得しますか?
どのウィジェットがクリックされたかを回復するにはどうすればよいですか?
Label2
が押されたとしたら、それがトリガーされたイベント内で押されたウィジェットであることを復旧することができます。
Tkinterでは、私は左マウスボタンに結合された複数のウィジェットを持っています。クリックしたときに同じイベントが発生します。イベントをトリガーしたウィジェットを取得しますか?
どのウィジェットがクリックされたかを回復するにはどうすればよいですか?
Label2
が押されたとしたら、それがトリガーされたイベント内で押されたウィジェットであることを復旧することができます。
def f(event):
caller = event.widget
あなたには2つのオプションがあります。 1つの方法は、イベントオブジェクトのwidget
属性にアクセスすることです。別の方法は、オブジェクト参照を関数に渡すことです。ここでは、それぞれを使用する例を示します。
import Tkinter as tk
def OnClickA(event):
print "you clicked on", event.widget
event.widget.config(text="Thank you!")
def OnClickB(event, obj):
print "you clicked on", obj
obj.config(text="Thank you!")
root = tk.Tk()
l1 = tk.Label(root, text="Click me")
l2 = tk.Label(root, text="No, click me!")
l1.pack()
l2.pack()
l1.bind("<1>", OnClickA)
l2.bind("<1>", lambda event, obj=l2: OnClickB(event, obj))
root.mainloop()
すべてのウィジェットのようなサウンドは、イベントハンドラを共有しています。 John W. Shipman - NM Techのからのこの抜粋は役に立ちます。
30.7. The extra arguments trick
時には、 イベント以外のハンドラに他の 引数を渡したいと思います。
ここは例です。 アプリケーションに、 チェック・ボタンの配列があり、そのウィジェットが のリストにある
は、すべて10 のこれらcheckbuttonsにself.cbList
、 のチェック・ボタン番号range(10)
で索引付けされているとします。<Button-1>
イベント用.__cbHandler
という名前 1つのハンドラを記述することをさらに仮定します。ハンドラは で渡さEvent
オブジェクトの.widget
属性を参照することにより、それを引き起こした実際のCheckbutton
ウィジェット を得ることができますが、どのように それはself.cbList
にそのチェックボタンの インデックスを見つけるのですか?チェックボタン番号、 このような何かのための余分な引数を使用して私たちのハンドラ を書くためにいいだろう:
def __cbHandler (self, event, cbNumber):
しかし、イベントハンドラが一つだけ 引数、イベントを渡されます。したがって、 の関数を引数の数が の不一致のために使用することはできません。
幸いにも、 のPythonの機能は、関数 の引数のデフォルト値を提供して、私たちに道を与えます。
def __createWidgets (self): ? self.cbList = [] # Create the checkbutton list for i in range(10): cb = Checkbutton (self, ?) self.cbList.append (cb) cb.grid(row=1, column=i) def handler (event, self=self, i=i): # [1] return self.__cbHandler (event, i) cb.bind ("<Button-1>", handler) ? def __cbHandler (self, event, cbNumber): ?
#
は、[1]これらの行は、新しい機能3つの の引数を期待しhandler
を定義します。このコードで 見てください。最初の引数はEvent
オブジェクトで、すべてのイベント ハンドラに渡され、2番目と3番目の引数はデフォルトの の値に設定されます。余分な引数は に渡されます。このテクニックを に拡張すると、ハンドラに追加の 引数を追加できます。
Aこれを行うには、わずかにより簡潔な方法ブライアンオークリーはhis answer第二ボタンの場合と同様、インラインラムダ各ハンドラ関数を定義することである、すなわち:
def __createWidgets (self):
?
self.cbList = [] # Create the checkbutton list
for i in range(10):
cb = Checkbutton (self, ?)
self.cbList.append (cb)
cb.grid(row=1, column=i)
cb.bind ("<Button-1>", lambda event, self=self, i=i:
self.__cbHandler(event, i))
?
def __cbHandler (self, event, cbNumber):
?