#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’