Как отправить несколько аргументов при привязке виджета к функции в Python 2.7.2 - PullRequest
0 голосов
/ 10 октября 2011

Просто интересно, как связать поле ввода с (с ключом возврата) функцией, которая требует 2 аргумента, считая событие как один из них без лямбды или классов, только одну функцию и 2 аргумента:

def function(event,entry):#entry is the widget to be focused. also, entry is just a place holder NOT A WIDGET. entry MUST be specified. it cannot be removed.
    entry.focus()

entry1.bind("<Return>",function(None,entry2))

Когда запись1 связана, функция, с которой она связана, выполняется сразу после ее привязки, а затем игнорирует все другие входные данные.Он позволяет мне помещать символы в поле, но когда я нажимаю клавишу возврата, он не проходит и фокусирует вторую запись.Если я удаляю None как один из аргументов, это дает мне ошибку, что определен только один из двух обязательных аргументов, не имеет значения, что я поставил вместо None, это все равно не работает.Как я могу заставить его работать без классов или анонимной функции?

Ответы [ 3 ]

3 голосов
/ 11 октября 2011

Когда вы пишете function(None,entry2) вы / находитесь / вызываете его сразу - функция, вероятно, возвращает None, поэтому по сути то, что вы делаете:

function(None, entry2)
entry1.bind("<Return>", None)

То, что вы, вероятно, ищетеэто:

entry1.bind("<Return>", lambda e: function(entry2))

Это генерирует функцию (примечание: генерирует функцию, но не вызывает ее), которая принимает один параметр (событие, "e") и игнорирует его

Когда вы затем нажмете клавишу возврата, будет сгенерирована эта сгенерированная функция, которая, в свою очередь, вызовет function(entry2)

1 голос
/ 11 октября 2011

Ответ должен использовать lambda.Для хорошего объяснения см. Обратные вызовы Tkinter на effbot.org

0 голосов
/ 10 октября 2011

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

Если вы измените оператор связывания на:

entry1.bind("<Return>", function)

функция будет вызываться при запуске события Return, а не при выполнении оператора bind.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...