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()