#python #events #binding #event-handling #tkinter
#python #Мероприятия #привязка #обработка событий #tkinter
Вопрос:
Просто интересно, как мне привязать поле ввода к (с помощью клавиши возврата) функции, для которой требуется 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))
Когда entry1 привязан, функция, к которой он привязан, выполняется сразу после привязки, а затем игнорирует все остальные входные данные. Это позволяет мне помещать символы в поле, но когда я нажимаю return, он не проходит и фокусирует вторую запись. Если я удаляю None в качестве одного из аргументов, это выдает ошибку, что определен только один из двух обязательных аргументов, неважно, что я ставлю вместо None, это все равно не работает. Как мне заставить его работать без классов или анонимной функции?
Ответ №1:
Когда вы пишете function(None,entry2)
, что вы / вызываете / вызываете его сразу — функция, вероятно, возвращается None
, поэтому, по сути, то, что вы делаете, это:
function(None, entry2)
entry1.bind("<Return>", None)
Вероятно, вы ищете следующее:
entry1.bind("<Return>", lambda e: function(entry2))
Это генерирует функцию (примечание: генерирует функцию, но не вызывает ее), которая принимает один параметр (событие, «e») и игнорирует его
Когда вы затем нажмете клавишу возврата, эта сгенерированная функция будет вызвана, и, в свою очередь, она вызовет function(entry2)
Комментарии:
1. Спасибо! Это сработало, мне пришлось удалить событие в качестве одного из аргументов! Спасибо вам оооочень большое!
2. Знаете ли вы, как передавать аргументы функции, как я делал выше, за исключением списка прокрутки мега-виджета Python (и не привязки, а с помощью встроенной функции dblclickcommand=(1)?)? потому что прямо сейчас это просто вызывает функцию сразу, и она не работает.
Ответ №2:
Ответ заключается в использовании lambda
. Для хорошего объяснения см. Обратные вызовы Tkinter на effbot.org
Ответ №3:
Без полного примера сложно дать полный ответ. Однако есть одна распространенная ошибка, которая легко исправляется: вторым аргументом для привязки должно быть имя функции, а не вызов функции.
Если вы измените оператор bind на:
entry1.bind("<Return>", function)
функция будет вызываться при срабатывании события возврата, а не при выполнении инструкции bind.
Комментарии:
1. что, если функции требуется 2 аргумента, включая событие в качестве одного из них?
2. Лямбда — это правильный ответ, но вы исключили лямбды и классы в постановке задачи. Если по какой-то причине вы абсолютно ненавидите lambda, то вызовите фиктивную функцию только с аргументом события, который затем вызывает фактическую функцию с аргументами события и ввода.