Python события и методы

Python события и методы

Tkinter позволяет обрабатывать события виджетов. Для обработки распространенных и наболее используемых событий Tkinter предоставляет интерфейс команд. Например, для обработки нажатия на кнопку ее параметру command надо передать функцию, которая будет вызываться при нажатии на кнопку

def click(): print("Hello") btn = ttk.Button(text="Click", command=click)

Ряд виджетов также позволяют с помощью параметра command задать обработчик для одного из событий данного виджета.

Однако что, если мы хотим обрабатывать другие события виджета. Например, для кнопки обработать получение фокуса, или обработать нажатие клавиши клавиатуры? Для подобных ситуаций Tkinter предоставляет ряд встроенных событий. Наиболее распространенные из них:

  • Activate : окно становится активным.
  • Deactivate : окно становится неактивным.
  • MouseWheel : прокрутка колеса мыши.
  • KeyPress : нажатие клавиши на клавиатуре.
  • KeyRelease : освобождение нажатой клавиши
  • ButtonPress : нажатие кнопки мыши.
  • ButtonRelease : освобождение кнопки мыши.
  • Motion : движение мыши.
  • Configure : изменение размера и положения виджета
  • Destroy : удаление виджета
  • FocusIn : получение фокуса
  • FocusOut : потеря фокуса.
  • Enter : указатель мыши вошел в пределы виджета.
  • Leave : указатель мыши покинул виджет.

Привязка событий

Для привязки события к виджету применяется метод bind() :

В качестве первого параметра указывается обрабатываемое событие, а в качестве второго — функция, которая обрабатывает событие.

Например, обработаем события получения и потери фокуса для кнопки:

from tkinter import * from tkinter import ttk root = Tk() root.title("METANIT.COM") root.geometry("250x200") def entered(event): btn["text"] ="Entered" def left(event): btn["text"] ="Left" btn = ttk.Button(text="Click") btn.pack(anchor=CENTER, expand=1) btn.bind("", entered) btn.bind("", left) root.mainloop()

Название событие передается в угловных скобках, например, «» или «». Для события Enter (получение фокуса) определен обработчик-функция entered, которая изменяет текст кнопки:

def entered(event): btn["text"] ="Entered"

Стоит обратить внимание, что функция обработки события должна принимать в качестве параметра объект события — в примере выше параметр event, даже если он в самой функции не используется.

Событие потери фокуса связывыется с функцией left:

Привязка событий в виджетах к функциям в tkinter и python

Кроме обычных событий некоторые виджеты Tkinter могут использовать виртуальные события или высокоуровневые события (выше были описаны низкоуровневые события), которые помещаются в двойные угловные скобки, например, событие выделения списка «>». Наиболее используемые виртуальные события будут рассмотрены в соответствующих темах про виджеты.

Читайте также:  Сделать квадратики в html

Шаблон события

В примере выше при привязке события указывалось только имя события например, «» или «». Но в реальности в фигурных скобках указывается не просто имя события, а его шаблон. Шаблон события имеет следующую форму:

Модификаторы события

Часто используемые модификаторы:

  • Alt : нажата клавиша Alt
  • Control : нажата клавиша Ctrl
  • Shift : нажата клавиша Shift
  • Any : нажата любая клавиша

Клавиши

Также в шаблоне можно указать конкретные клавиши или комбинации. Некоторые из них:

  • Alt_L : правая клавиша alt
  • Alt_R : правая клавиша alt
  • BackSpace : клавиша backspace
  • Cancel : клавиша break
  • Caps_Lock клавиша CapsLock
  • Control_L : левая клавиша control
  • Control_R : правая клавиша control
  • Delete : клавиша Delete
  • Down : клавиша ↓
  • End : клавиша end
  • Escape : клавиша esc
  • Execute : клавиша SysReq
  • F1 : клавиша F1
  • F2 : клавиша F2
  • Fi : функциональная клавиша Fi
  • F12 : клавиша F12
  • Home : клавиша home
  • Insert : клавиша insert
  • Left : клавиша >←
  • Linefeed : клавиша Linefeed (control-J)
  • KP_0 : клавиша 0
  • KP_1 : клавиша 1
  • KP_2 : клавиша 2
  • KP_3 : клавиша 3
  • KP_4 : клавиша 4
  • KP_5 : клавиша 5
  • KP_6 : клавиша 6
  • KP_7 : клавиша 7
  • KP_8 : клавиша 8
  • KP_9 : клавиша 9
  • KP_Add : клавиша +
  • KP_Begin : центральная клавиша (5)
  • KP_Decimal : клавиша точка ( . )
  • KP_Delete : клавиша delete
  • KP_Divide : клавиша /
  • KP_Down : клавиша ↓
  • KP_End : клавиша end
  • KP_Enter : клавиша enter
  • KP_Home : клавиша home
  • KP_Insert : клавиша insert
  • KP_Left : клавиша ←
  • KP_Multiply : клавиша ×
  • KP_Next : клавиша PageDown
  • KP_Prior : клавиша PageUp
  • KP_Right : клавиша →
  • KP_Subtract : клавиша —
  • KP_Up : клавиша ↑
  • Next : клавиша PageDown
  • Num_Lock : клавиша NumLock
  • Pause : клавиша pause
  • Print : клавиша PrintScrn
  • Prior : клавиша PageUp
  • Return : клавиша Enter
  • Right : клавиша →
  • Scroll_Lock : клавиша ScrollLock
  • Shift_L : левая клавиша shift
  • Shift_R : правая клавиша shift
  • Tab : клавиша tab
from tkinter import * from tkinter import ttk root = Tk() root.title("METANIT.COM") root.geometry("250x200") def single_click(event): btn["text"] ="Single Click" def double_click(event): btn["text"] ="Double Click" btn = ttk.Button(text="Click") btn.pack(anchor=CENTER, expand=1) btn.bind("", single_click) btn.bind("", double_click) root.mainloop()

Здесь в шаблоне «» ButtonPress — название события — нажатие кнопки мыши, а «1» указывает на конкретную кнопку — левую кнопку мыши (например, 3 — представляет правую кнопку)

А в шаблоне «» лобавляется модификатор Doubles , который указывает на двойное нажатие.

Глобальная регистрация события

В примерах выше обработка события устанавливалась для одного конкретного объекта — для одной кнопки. Но что, если у нас много кнопок и мы хотим, чтобы для всех была установлена привязка одного и тоже события с одной и той же функцией_обработчиком? В этом случае мы можем установить привязку события глобально ко всем объектам класса с помощью метода bind_class класса Tk:

from tkinter import * from tkinter import ttk clicks = 0 root = Tk() root.title("METANIT.COM") root.geometry("250x200") def clicked(event): global clicks clicks = clicks + 1 btn["text"] =f" Clicks" btn = ttk.Button(text="Click") btn.pack(anchor=CENTER, expand=1) # привязка события к кнопкам ttk.Button root.bind_class("TButton", "", clicked) root.mainloop()

В данном случае для кнопок для обработки двойного нажатия установаливается обработчик — функция clicked. Причем события привязывается к кнопкам из пакета tkinter.ttk, поэтому в типа виджетов качестве используется «TButton» (а не просто Button).

Читайте также:  Hello WebSocket

Удаление события

Для открепления события от виджета вызывается метод unbind() , в который передается шаблон события:

Источник

События и сигналы в PyQt5

Python 3 логотип

В этой части учебника PyQt5, мы изучим события и сигналы, встречающиеся в приложениях.

События

Все приложения с графическим интерфейсом являются событийно-ориентированными. События вызываются главным образом пользователем приложения. Однако, они могут быть вызваны другими средствами, к примеру подключением к Интернету, диспетчером окон или таймером. Когда мы вызываем метод exec_(), приложение входит в главный цикл. Главный цикл получает события и отправляет их объектам.

В модели событий имеются три участника:

Источник события – это объект, состояние которого меняется. Он вызывает событие. Событие инкапсулирует изменение состояния в источнике события. Цель события – это объект, которому требуется уведомление. Объект источника события делегирует задачу обработки события цели события.

Для работы с событиями PyQt5 имеет уникальный механизм сигналов и слотов. Сигналы и слоты используются для связи между объектами. Сигнал срабатывает тогда, когда происходит конкретное событие. Слот может быть любой функцией. Слот вызывается, когда срабатывает его сигнал.

Сигналы и слоты

Это простой пример, демонстрирующий сигналы и слоты в PyQt5.

 В этом примере, мы показываем QtGui.QLCDNumber и QtGui.QSlider. Мы меняем число lcd путём перемещения ползунка регулятора.
Здесь мы присоединяем сигнал valueChanged слайдера к слоту display числа lcd.

Отправитель – объект, который посылает сигнал. Получатель – объект, который получает сигнал. Слот – это метод, который реагирует на сигнал.

Переопределение обработчика события

События в PyQt5 часто обрабатываются путём переопределения обработчиков.

 В этом примере, мы переопределяем обработчик события keyPressEvent().
Если мы нажимаем клавишу Esc, то приложение завершается.

Отправитель события

Иногда удобно знать, какой именно виджет является отправителем сигнала. Для этого PyQt5 имеет метод sender().

 В нашем примере у нас есть две кнопки. В методе buttonClicked() мы определяем, какую из кнопок мы нажали с помощью метода sender().
Обе кнопки подключаются к одному слоту.
Мы определяем источник сигнала с помощью метода sender(). В строке состояния приложения, мы показываем метку нажатой кнопки.

Отправка сигналов

Объекты, создаваемые из QObject, могут посылать сигналы. В следующем примере, мы увидим, как мы может послать пользовательский сигнал.

Мы создаём новый сигнал, названный closeApp. Этот сигнал отправляется во время события нажатия кнопки мыши. Сигнал присоединяется к слоту close() класса QMainWindow.
Сигнал создаётся с помощью pyqtSignal() как атрибут внешнего класса Communicate.
Пользовательский сигнал closeApp присоединяется к слоту close() класса QMainWindow.
Когда мы кликаем на окне курсором мыши, посылается сигнал closeApp. Приложение завершается.

В этой части руководства PyQt5, мы рассмотрели сигналы и слоты.

Для вставки кода на Python в комментарий заключайте его в теги

  • Книги о Python
  • GUI (графический интерфейс пользователя)
  • Курсы Python
  • Модули
  • Новости мира Python
  • NumPy
  • Обработка данных
  • Основы программирования
  • Примеры программ
  • Типы данных в Python
  • Видео
  • Python для Web
  • Работа для Python-программистов

Источник

Оцените статью