Jython Swing:在按钮按下时传递多个参数
我正在用Jython在一个循环中创建几个Swing的JButton按钮。每当按钮被按下时,它们都应该调用同一个函数,只是传入的参数不同。我在传递参数时遇到了麻烦,除了self和event之外,其他参数我不知道怎么传。
这个方法可以正常工作:
for x in range(0,3):
name = JButton(str(x))
name.actionPerformed = self.foo
def foo(self, event):
print "I work."
奇怪的是,event会神奇地传递给这个方法。
但这个方法就不行:
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)
我觉得问题在于,当我添加任何参数时,就不再传递event了,结果出现了一个错误,提示“foo()需要3个参数(但只给了2个)”。我明白这个问题,但我该怎么从按钮中提取event呢?
2 个回答
1
我选择了delnan的回答,但我找到了一种更针对性的问题解决方案,打算在这种情况下使用,觉得分享一下也不错。
与其在函数调用中添加额外的信息,不如直接利用传递过来的事件来获取调用者的信息,这样做其实很简单。
也就是说:
for x in range(0,3):
name = JButton(str(x))
name.actionPerformed = self.foo
def foo(self, event):
sender = event.getSource()
print sender.getText()
4
回调函数只会接收调用它的代码(比如图形用户界面工具包)传入的内容。如果你想传入更多的东西,而又说服不了调用者传递额外的内容,那就没办法了。
不过幸运的是,有个小窍门:你可以传递任意可调用的对象(比如函数),而且你可以构造部分函数,这种函数是包裹着另一个函数的,能够记住额外的参数,每次调用时都会把这些参数一起传过去。
import functools
def callback(x, y):
return x + y
g = functools.partial(callback, y=3)
g(2) #=> 5
不过要注意,有些奇怪的参数顺序可能会导致问题(比如,如果第一个参数是通过关键字参数传入的,你就不容易用位置参数来调用部分函数),但对于你的情况(在参数列表的末尾添加参数),应该是没问题的。你只需要使用关键字参数就可以了。