Я не знаю, почему только лямбда-функция может запускаться, когда я использую команду кнопки GUI

#python #function #button #tkinter #lambda

#python #функция #кнопка #tkinter #лямбда

Вопрос:

 def btn_click(btn):
    global expression
    expression = expression   str(btn)
    btn_input.set(expression)


btn_7= Button(root, text = '7', width =5, height =2, command=lambda:btn_click(7))
# btn_7= Button(root, text = '7', width =5, height =2, command=btn_click(7))
  

Итак, могу ли я узнать причину и принцип этого кода?

Ответ №1:

Это обычное дело, когда вам нужно передать как функцию, так и ее аргумент чему-то, ожидающему только функцию.

В вашем втором примере command=btn_click(7) будет вызываться btn_click(7) и передаваться результаты command , который по своему имени ищет вызываемую (функцию).

Если вы обернете вызов своей функции в лямбду, вы затем передаете неназванный вызываемый command объект, который при вызове вычисляется btn_click(7) .

Ответ №2:

Вы можете запускать обычные функции с помощью этого аргумента ‘command’, но дело в том, что вы не сможете передавать аргументы функции

 def func():
    print('click')
button = Button(root, text = '7', width =5, height =2, command=func)
# If you run this and click the button you'll see 'click' message in the console
  

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

 def func(num):
    print(num)
button = Button(root, text = '7', width =5, height =2, command=lambda: func(7))
  

Когда вы делаете это таким образом, происходит следующее:
При нажатии кнопки TKinter вызывает эту лямбда-функцию, а затем лямбда-функция вызывает ваш func() с аргументом ‘7’