【问题标题】:Jython Swing: Passing more than self and event on a button pressJython Swing:在按下按钮时传递的不仅仅是 self 和 event
【发布时间】:2014-09-17 17:32:34
【问题描述】:

我在 Jython 的循环中创建了几个摇摆 JButtons 按钮。按下时,每个按钮都应调用相同的函数,但具有不同的参数。我在传递 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 个)” .我明白了,但是如何从按钮中提取事件?

【问题讨论】:

    标签: python swing jython


    【解决方案1】:

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

    但幸运的是,有一个漏洞:您可以传递任意可调用对象,并且可以构造部分函数,​​这些函数是包装另一个函数的函数,在调用时记住要传递的附加参数。

    import functools
    
    def callback(x, y):
        return x + y
    
    g = functools.partial(callback, y=3)
    g(2) #=> 5
    

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

    【讨论】:

    • 感谢您提供广泛而出色的答案。这将在我定义的问题范围之外非常有用。
    【解决方案2】:

    我同意 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()
    

    【讨论】:

    • 我发现你的答案很含糊,但谷歌搜索并发现了你的意思。对于未来的读者:您可以在JButton 上使用setActionCommand,然后使用传入的event 中的getActionCommand。在此处阅读更多信息:stackoverflow.com/questions/21533356/…
    猜你喜欢
    • 1970-01-01
    • 2016-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    相关资源
    最近更新 更多