Jython Swing: передача больше чем себя и события нажатием кнопки

Я создаю пару кнопок JButtons в цикле в Jython. При нажатии каждая кнопка должна вызывать одну и ту же функцию, но с одним другим параметром. У меня проблемы с передачей каких-либо параметров вне себя и событий.

Это работает:

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 ответа

Решение

Обратный вызов принимает только то, что проходит код, вызывающий его (инструментарий GUI). Если вы хотите передать больше и не можете убедить этого вызывающего абонента передать что-то дополнительное, вам не повезло.

Но, к счастью, есть лазейка: вы можете передавать произвольные вызовы, и вы можете создавать частичные функции, которые являются функциями, обертывающими другую функцию, запоминая дополнительные аргументы для передачи при каждом вызове.

import functools

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

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

Есть несколько проблем со странными порядками аргументов (например, вы не можете легко вызывать партиал с позиционными аргументами, если первый аргумент был передан через аргумент ключевого слова), но ваш вариант использования (добавьте аргументы в конец списка аргументов) должен работать просто хорошо. Вам просто нужно использовать ключевые аргументы.

Я иду с ответом Делнана, но я нашел другое, более конкретное решение проблемы, которое я собираюсь использовать в этом случае, и подумал, что стоило бы поделиться им.

Вместо добавления дополнительной информации к вызову функции довольно просто использовать переданное событие для получения информации о вызывающей стороне.

IE

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

def foo(self, event):
   sender = event.getSource()
   print sender.getText()
Другие вопросы по тегам