Tkinter command binding в Python — связывание кнопок с функциями
Рассмотрим привязку команд Tkinter, которая связывает обратный вызов с событием виджета.
Введение в Tkinter command binding
Чтобы сделать приложение более интерактивным, виджеты должны реагировать на такие события, как:
- Щелчки мыши
- Нажатия клавиш
Для этого требуется назначить функцию обратного вызова определенному событию. Когда событие происходит, функция обратного вызова будет вызвана автоматически для обработки события.
В Tkinter некоторые виджеты позволяют связывать функцию обратного вызова с событием с помощью привязки команды.
Это означает, что вы можете назначить имя функции командной опции виджета, чтобы при возникновении события в виджете функция вызывалась автоматически.
Чтобы использовать привязку команд, выполните следующие действия:
- Сначала определите функцию как обратный вызов.
- Затем присвойте имя функции параметру команды виджета.
Например, следующее определяет функцию с именем button_clicked():
def button_clicked(): print('Button clicked')
После этого вы можете связать функцию с опцией команды виджета кнопки:
ttk.Button(root, text='Click Me',command=button_clicked)
Обратите внимание, что вы передаете обратный вызов без скобок() в опции команды. В противном случае обратный вызов будет вызван сразу после запуска программы.
Следующая программа иллюстрирует, как связать функцию обратного вызова button_clicked с виджетом Button:
import tkinter as tk from tkinter import ttk root = tk.Tk() def button_clicked(): print('Button clicked') button = ttk.Button(root, text='Click Me', command=button_clicked) button.pack() root.mainloop()
Аргументы Tkinter button command
Если вы хотите передать аргументы функции обратного вызова, вы можете использовать лямбда-выражение.
Сначала определите функцию, которая принимает аргумент args:
def callback_function(args): # do something
Затем определите лямбда-выражение и назначьте его аргументу команды виджета кнопки. Внутри лямбда-выражения вызовите функцию обратного вызова:
ttk.Button( root, text='Button', command=lambda: callback(args) )
Следующая программа иллюстрирует, как передать аргумент функции обратного вызова, связанной с командой кнопки:
import tkinter as tk from tkinter import ttk root = tk.Tk() def select(option): print(option) ttk.Button(root, text='Rock', command=lambda: select('Rock')).pack() ttk.Button(root, text='Paper',command=lambda: select('Paper')).pack() ttk.Button(root, text='Scissors', command=lambda: select('Scissors')).pack() root.mainloop()
При нажатии кнопки будет выполнено лямбда-выражение, связанное с командой кнопки. Оно вызовет функцию select() со строковым аргументом.
Ограничения привязки команд
Во-первых, опция команды доступна не во всех виджетах; она ограничена кнопкой и некоторыми другими виджетами.
Во-вторых, кнопка «Command» привязана к левому щелчку и кнопке Backspace, но не привязана к клавише Return. Чтобы проверить это, вы можете переместить фокус на кнопку в программе выше и нажать клавиши Backspace и Return.
К сожалению, это не очень удобно для пользователя, и вы не можете легко изменить привязку командной функции. Чтобы преодолеть эти ограничения, Tkinter предоставляет альтернативный способ связывания функции с событием, называемый привязкой события.