2010-11-28 8 views
7

Tkinterでは、私は左マウスボタンに結合された複数のウィジェットを持っています。クリックしたときに同じイベントが発生します。イベントをトリガーしたウィジェットを取得しますか?

どのウィジェットがクリックされたかを回復するにはどうすればよいですか?

Label2が押されたとしたら、それがトリガーされたイベント内で押されたウィジェットであることを復旧することができます。

答えて

8
def f(event): 
    caller = event.widget 
8

あなたには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() 
2

すべてのウィジェットのようなサウンドは、イベントハンドラを共有しています。 John W. Shipman - NM Techのからのこの抜粋は役に立ちます。

30.7. The extra arguments trick

時には、 イベント以外のハンドラに他の 引数を渡したいと思います。

ここは例です。 アプリケーションに、 チェック・ボタンの配列があり、そのウィジェットが のリストにあるself.cbList、 のチェック・ボタン番号range(10)で索引付けされているとします。

は、すべて10 のこれらcheckbuttonsに <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): 
    ? 
関連する問題