2009-10-08 28 views
8

私はPythonを学んでいる間、シンプルな小さなユーティリティを作っています。Tkinterでどのボタンが押されたかを確認しますか?

for method in methods: 
    button = Button(self.methodFrame, text=method, command=self.populateMethod) 
    button.pack({'fill': 'x', 'expand': 1, 'padx': 5, 'pady': 3}) 

この部分はうまく動作します。しかし、どのボタンがself.populateMethodの中に押されたのか知る必要があります。どのように私が話すことができるかもしれないかに関するアドバイス?

答えて

15

は、コマンドに引数を渡すためにラムダを使用することができます。

def populateMethod(self, method): 
    print "method:", method 

for method in ["one","two","three"]: 
    button = Button(self.methodFrame, text=method, 
     command=lambda m=method: self.populateMethod(m)) 
    button.pack({'fill': 'x', 'expand': 1, 'padx': 5, 'pady': 3}) 
1

コマンドメソッドがイベントオブジェクトを渡されていないようです。

私は2つの回避策を考えることができます。代わりにcommandとしてself.populateMethodを渡すの

  • 各ボタンに独自のコールバックを関連付ける

  • コールbutton.bind('<Button-1>', self.populateMethod)。 self.populateMethodはイベントオブジェクトとなる第2引数を受け入れなければなりません。

    この第2引数がeventと呼ばれると仮定すると、event.widgetは、クリックされたボタンへの参照です。

+0

私は、第二の方法を行なったし、私がやりたいようです。ありがとう! – Sydius

+0

組み込みの 'command'属性を利用するのではなく' bind'を使うと、Tkinterの組み込み機能を使ってキーボードでボタンをクリックして移動する機能が失われます。もちろん、すべての特殊なケースを扱うために束縛を適用することもできますが、 'command'属性を使うのは簡単です。 –

+0

@BryanOakley:確かに;ラムダを使用することの提案ははるかにクリーンです。 –

関連する問題