Это просто немедленно вызывает метод, и нажатие кнопки ничего не делает.
Смотрите Связыватели аргументов Python для стандартных методов (не специфичных для Tkinter) решения проблемы. Работа с обратными вызовами в Tkinter (или других графических фреймворках) требует некоторых особых соображений, поскольку возвращаемое значение из обратного вызова бесполезно.
Если вы попытаетесь создать несколько кнопок в цикле, передавая каждой разные аргументы на основе счетчика цикла, вы можете столкнуться с проблемами из-за того, что называется поздней привязкой. Пожалуйста, смотрите, tkinter создает кнопки в цикле for, передавая аргументы команды для получения подробной информации.
Видите, что при btn нажатии она вызывает свою собственную функцию, которая очень похожа на button_press_handle в следующем примере:
defbutton_press_handle(callback=None): if callback: callback() # Where exactly the method assigned to btn['command'] is being callled
с помощью:
button_press_handle(btn['command'])
Вы можете просто подумать, что command параметр должен быть установлен как, ссылка на метод, который мы хотим вызвать, аналогично callback в button_press_handle.
Итак, если бы я хотел print что-то делать при нажатии кнопки, мне нужно было бы установить:
btn['command'] = print# default to print is new line
Обратите пристальное внимание на отсутствие метода () with print, который опущен в значении, что: "Это имя метода, которое я хочу, чтобы вы вызывали при нажатии но не вызывайте его прямо сейчас". Однако я не передавал никаких аргументов для print поэтому он печатал все, что печатает при вызове без аргументов.
С аргументами
Теперь, если бы я хотел также передавать аргументы методу, который я хочу вызывать при нажатии кнопки, я мог бы использовать анонимные функции, которые могут быть созданы с помощью оператора lambda, в данном случае для print встроенного метода, например, следующего:
Вы также можете добиться этого, используя оператор lambda, но это считается плохой практикой, и поэтому я не буду включать его здесь. Рекомендуется определить отдельный метод, multiple_methods который вызывает нужные методы, а затем установить его в качестве обратного вызова при нажатии кнопки:
defmultiple_methods(): print("Vicariously") # the first inner callback print("I") # another inner callback
С аргументами
Чтобы передать аргументы методу, который вызывает другие методы, снова используйте оператор lambda , но сначала:
defmultiple_methods(*args, **kwargs): print(args[0]) # the first inner callback print(kwargs['opt1']) # another inner callback
Также дополнительно обратите внимание, что callback на самом деле это невозможно return, потому что это вызывается только внутри button_press_handle with callback() в отличие от return callback(). Это происходит, return но не где-либо за пределами этой функции. Таким образом, вам следует скорее модифицировать объекты, доступные в текущей области видимости.
Полный пример с глобальными модификациями объектов
Приведенный ниже пример вызовет метод, который изменяет btn текст при каждом нажатии кнопки:
import tkinter as tk
i = 0 deftext_mod(): global i, btn # btn can be omitted but not sure if should be txt = ("Vicariously", "I", "live", "as", "the", "whole", "world", "dies") btn['text'] = txt[i] # the global object that is modified i = (i + 1) % len(txt) # another global object that gets modified