Как мне отправить несколько аргументов при привязке виджета к функции в python 2.7.2

#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, то вызовите фиктивную функцию только с аргументом события, который затем вызывает фактическую функцию с аргументами события и ввода.