Jython Swing:按下按钮,传递的不仅仅是自我和事件

时间:2011-11-10 18:44:47

标签: python swing jython

我在Jython的循环中创建了几个swing JButtons按钮。按下时,每个按钮应调用相同的功能,但使用一个不同的参数。我在传递自我和事件之外的任何参数时遇到了麻烦。

这有效:

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个给定)” 。我明白了,但是如何从按钮中提取事件呢?

2 个答案:

答案 0 :(得分:4)

回调只接受调用它的代码(GUI工具包)传入的内容。如果你想传入更多内容并且你无法说服调用者传递额外的东西,那你就不走运了。

但幸运的是,有一个漏洞:你可以传递任意的callables,你可以构造部分函数,​​这是函数包装另一个函数,记住在调用时传递的其他参数。

import functools

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

g = functools.partial(callback, y=3)
g(2) #=> 5

奇怪的参数命令存在一些问题(例如,如果第一个参数是通过关键字参数提供的话,你不能轻易地用位置参数调用partial),但你的用例(在参数列表的末尾添加参数)应该工作得很好。您只需要使用关键字参数。

答案 1 :(得分:1)

我正在接受德尔南的回答,但我确实找到了另一个我将在这种情况下使用的问题特定解决方案,并认为值得传递。

不是向函数调用添加其他信息,而是使用传递的事件来获取调用者的信息。

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

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