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