2011-11-10 3 views
1

私はJythonのループで2つのスイングJButtonsボタンを作成しています。押すごとに、各ボタンは同じ機能を呼び出す必要がありますが、1つの異なるパラメータで呼び出す必要があります。私は自己とイベントの外部にあるパラメータを渡すのに問題があります。Jython Swing:ボタンプレスでselfとevent以上のものを渡す

これは動作します:

for x in range(0,3): 
    name = JButton(str(x)) 
    name.actionPerformed = self.foo 

def foo(self, event): 
    print "I work." 

何とかイベントが魔法のメソッドに渡されます。

これはしていません:

for x in range(0,3): 
    name = JButton(str(x)) 
    name.actionPerformed = self.foo(x) 

def foo(self, event, number): 
    print "I don't work." 
    print str(number) 

問題私はそれを見るように、それは私が任意の引数を追加したときに、私は、私はもはやイベントを渡さないではないと私は私を伝えるエラーで終わること"foo()は3つの引数(2つの引数)をとります"。私はそれを得るが、どのようにボタンからイベントを抽出することができますか?

答えて

4

コールバックでは、それを呼び出すコード(GUIツールキット)が渡すだけです。さらに渡したい場合、前述の呼び出し元に余分なものを渡すように説得することができない場合、あなたは不運です。

しかし幸いなことに、抜け穴があります:任意の呼び出し可能な関数を渡すことができます。また、別の関数をラップする関数である部分関数を作成して、

import functools 

def callback(x, y): 
    return x + y 

g = functools.partial(callback, y=3) 
g(2) #=> 5 
奇妙な引数の注文でいくつかの問題(最初の引数はキーワード引数を介して供給された場合、例えば、あなたが簡単に位置引数と部分的に呼び出すことはできませんが)あります

が、あなたのユースケース(の末尾に引数を追加引数リスト)はうまくいくはずです。キーワード引数を使うだけでいいです。

+0

広範かつ優れた答えをありがとう。これは、私が定義した問題の範囲外のところでは役に立ちます。 – sarwar

1

私はdelnanの答えに行くつもりですが、私はこのケースで使用しようとしている別の問題の特定の解決策を見つけ出し、渡す価値があると思っていました。

関数呼び出しに追加情報を追加する代わりに、渡されたイベントを使用して呼び出し元に関する情報を取得するのは簡単です。

I.E.

for x in range(0,3): 
    name = JButton(str(x)) 
    name.actionPerformed = self.foo 

def foo(self, event): 
    sender = event.getSource() 
    print sender.getText() 
+0

私はあなたの答えをかなり曖昧だが、グーグルで見つけて、あなたが意味するものを見つけた。将来の読者のために:渡された 'event'の' getActionCommand'に続く 'JButton'に' setActionCommand'を使うことができます。もっと詳しく読む:http://stackoverflow.com/questions/21533356/is-there-a- way-to-store-data-in-a-jbutton –

関連する問題