Параметр command
ссылается на функцию, которая является причудливым способом сказать, что вам нужно передать ей имя функции. Когда вы выполняете button('hey')
, вы вызываете функцию button
, , и результат этого присваивается опции command
.
Чтобы передать ссылку, вы должны использовать только имя, не используя круглые скобки или аргументы. Например:
b = Button(... command = button)
Если вы хотите передать такой параметр, как «hey», вы должны использовать небольшой дополнительный код:
button
, lambda
, чтобы создать то, что называется анонимной функцией . Во всех отношениях это функция, за исключением того, что у нее нет имени. Когда вы вызываете команду lambda
, она возвращает ссылку на созданную функцию, что означает, что она может использоваться для значения параметра command
для кнопки. Для меня lambda
является самым простым, поскольку он не требует каких-либо дополнительных импортов, таких как functools.partial
, хотя некоторые люди думают, что functools.partial
легче понять.
Чтобы создать функцию лямбда, которая вызывает вашу функцию button
с аргументом, вы сделали бы что-то вроде этого:
lambda: button('hey')
Вы получаете функцию, функционально эквивалентную:
def some_name():
button('hey')
Как я уже говорил ранее, lambda
возвращает ссылку на эту безымянную функцию. Поскольку ссылка означает, что вариант command
предполагает, что вы можете использовать lambda
направление при создании кнопки:
b = Button(... command = lambda: button('hey'))
На этом сайте есть вопрос, который содержит много интересных комментариев о лямбда , в целом. См. Вопрос Почему Python lambdas полезны? . В этом же обсуждении был ответ, в котором показано, как использовать лямбда в петле , когда вам нужно передать переменную в обратный вызов.
Наконец, см. раздел Tkinter Callbacks на effbot.org для хорошего учебника. Охват лямбда довольно скудный, но информация там может быть полезной.
Вы можете прочитать подробную информацию здесь
https://docs.microsoft.com/en-us/visualstudio/ide/quickstart-aspnet-core