Любой пользовательский интерфейс предназначен (в том числе, но не только) для того чтобы получать от пользователя информацию и команды.
Когда пользователь жмет на кнопку, или нажимает Ввод в текстовом поле — это событие (event) в программе и, возможно (но не обязательно), программа должна обработать его в одной из своих функций. Такие функции называют Обработчиками Событий.
И мы должны как-то уметь связывать событие (bind) (напр. нажатие на кнопку с функцией обработчиком).
События и связывания событий (event and bind) в Tkinter
В зависимости от виджета в Tkinter у него могут быть одни события, и не быть других. И есть два способа связывания событий с обработчиками:
- Первый — это указанию виджету обработчика на стандартное для данного виджета событие (например на нажатие или клик по кнопке) через передачу callback в аргументе command этого виджета при создании виджета и перед размещением его в контейнере. При этом не у всех виджетов Tk есть такой аргумент. Например у виджета Button аргумент command есть, а у Label нет.
 - Второй способ — использование метода bind. Этот метод есть у всех виджетов унаследованных от класса Widget.
 
Также мы можем создавать свои события и назначать их на виджеты. Подробнее о всех этих возможностях в видео:
Код примера по работе с обработчиками событий в Tkinter
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44  | 
						import tkinter from tkinter import Tk, Text, Label, Frame, ttk def command_fn(e=None):     print(["Нажато Кнопко", e]) """ Tkinter events """ if __name__ == '__main__':     print("** Hola Hey, Azzrael_YT subs!!!\n")     r = Tk()     r.geometry("600x200+960+120")     # чуть вспомним предыдущий видос про оформление виджетов ;)     # https://azzrael.ru/tkinter-tk-ttk-diff-python-gui-4     tk_btns = {         'text': "Съешь ещё этих \nмягких булок.",         'bg': "#00dd00",         'activebackground': "#007700",         'fg': "white",         'font': ("Times", 16, "bold")     }     r.event_add('<<AllTheBtn>>', '<Button>', '<space>', 'a')     # r.bind('<Return>', command_fn)     entry = tkinter.Entry()     # entry.focus_set()     entry.bind('<Return>', lambda x: r.event_generate('<<AllTheBtn>>', when="tail"))  # поставить в очередь http://tcl.tk/man/tcl8.5/TkCmd/event.htm#M34     entry.pack(pady=5, padx=10, fill=tkinter.X)     btn1 = tkinter.Button(**tk_btns)     btn2 = tkinter.Button(**{**tk_btns, 'text': "Я не могу, \nмне нельзя, \nя худею!", 'bg': "red", 'activebackground': "pink" })     # btn2['command'] = command_fn  # space работает, enter нет     btn1.bind('<<AllTheBtn>>', command_fn)     btn2.bind('<<AllTheBtn>>', command_fn)     btn1.pack(side=tkinter.LEFT, expand=1, fill="both", padx=10, pady=10)     btn2.pack(side=tkinter.RIGHT, expand=1, fill="both", padx=10, pady=10)     r.mainloop()  | 
					
Полезные ссылки по работе с событиями в Tkinter
- Официальная документация Python по событиям в Tkinter
 - Список всех поддерживаемых событий и описание способов построения последовательности событий (напр. нажатия нескольких клавиш на клавиатуре).
 
А дальше?
Если вам понравится тема Tkinter (вы будете смотреть видео и ставить лайки ;) ) то подробнее о событиях поговорим когда будем вместе изучать каждый виджет Tk по отдельности. В Tk есть интересные способы организации взаимодействия с пользователем (как в css) в виде последовательности событий и я с удовольствием бы поснимал видео с экспериментами, если их будут смотреть ;)))
Виктор 2022-01-07