Любой пользовательский интерфейс предназначен (в том числе, но не только) для того чтобы получать от пользователя информацию и команды.
Когда пользователь жмет на кнопку, или нажимает Ввод в текстовом поле — это событие (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