Jython Swing: передача больше чем себя и события нажатием кнопки - PullRequest
1 голос
/ 10 ноября 2011

Я создаю пару свинг-кнопок 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 ]

4 голосов
/ 10 ноября 2011

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

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

import functools

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

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

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

1 голос
/ 11 ноября 2011

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

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

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