Jython Swing:在按钮按下时传递多个参数

1 投票
2 回答
841 浏览
提问于 2025-04-17 06:03

我正在用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

不过要注意,有些奇怪的参数顺序可能会导致问题(比如,如果第一个参数是通过关键字参数传入的,你就不容易用位置参数来调用部分函数),但对于你的情况(在参数列表的末尾添加参数),应该是没问题的。你只需要使用关键字参数就可以了。

撰写回答