Table Of Contents
Менеджер событий¶
EventManagerBase
является абстрактным классом, предназначенным для конкретной
реализации распределения событий движения
(экземпляры MotionEvent
) для виджетов через
метод on_motion()
класса Widget
.
Предупреждение
Эта функция является экспериментальной и остаётся таковой, пока это предупреждение присутствует.
Менеджер - это прослойка между окном и его виджетами.
WindowBase
будет пересылать все события, которые он получает,
в метод on_motion()
всем менеджерам,
которые заявили, что они хотят получать события этого типа. Событие будет продолжать
проходить по списку менеджеров даже в том случае, если один из них его примет (вернёт True).
Когда использовать менеджер событий¶
Используйте менеджер, когда вам нужно:
Распределять события касания, наведения, клавиатуры, джойстика или любые другие события к виджетам через метод
on_motion()
.Распределять отфильтрованные события движения по каким-либо критериям, таким как
device
илиprofile
.Объединять несколько событий движения (касание, наведение и так далее) в одно новое событие и распределять его по виджетам.
Распределять одноразовые общие события, такие как приостановка/возобновление приложения.
Создать симулятор событий, такой как симулятор касания, который рисует круг на холсте окна для каждого симулированного касания.
Определение и регистрация менеджера событий¶
Унаследуйтесь от
EventManagerBase
и определите, какие события должен получать этот менеджер, объявив типы событий в атрибутеEventManagerBase.type_ids
.Реализуйте метод < code class="xref py py-meth docutils literal notranslate">EventManagerBase.dispatch(), который будет вызван окном, чтобы передать тип события (один из “begin”, “update”, “end”) и событие.
Реализуйте методы
EventManagerBase.start()
иEventManagerBase.stop()
для выделения и освобождения дополнительных ресурсов при необходимости.Зарегистрируйте экземпляр менеджера в окне, используя метод
register_event_manager()
. Это можно сделать путем переопределения методовbuild()
илиon_start()
.
Все зарегистрированные менеджеры хранятся в списке
event_managers
. Чтобы отменить регистрацию менеджера, вызовите метод
unregister_event_manager()
,
который в свою очередь может быть вызван в методе on_stop()
.
Распределение событий по виджетам¶
После регистрации окно запустит менеджера и пересылает все события указанных типов
в атрибуте EventManagerBase.type_ids
методу EventManagerBase.dispatch()
менеджера. Это зависит от менеджера,
каким образом он будет их распределять, либо путем прохода по списку
EventManagerBase.window.children
и распределения события on_motion, либо используя другую логику. Также менеджер может распределять
захваченные события, если событие поддерживает функцию захвата
(см. методы grab()
и
ungrab()
).
Менеджер может назначить другой режим распределения, чтобы решить, как событие
должно распределяться по дереву виджетов, изменив значение атрибута
dispatch_mode
. Перед
изменением режима менеджер должен сохранить/восстановить текущий режим, либо с помощью
локальной переменной, либо с помощью атрибутов события.
Распределение событий в виджеты¶
После регистрации окно запустит менеджер и пересылает все события типов, объявленных в EventManagerBase.type_ids
, в метод EventManagerBase.dispatch()
менеджера. Менеджеру предоставляется право решать, как их распределять, будь то путем прохождения через список EventManagerBase.window.children
и передачи события on_motion, или путем использования другой логики. Также менеджеру предоставляется возможность передачи захваченных событий, если функция захвата поддерживается событием (см. методы grab()
и ungrab()
).
Менеджер может назначить разный режим распределения, чтобы определить, как событие должно распространяться по всему дереву виджетов, изменив значение атрибута dispatch_mode
. Перед изменением режима менеджер должен сохранить/восстановить текущий режим, либо используя локальную переменную, либо с помощью методов push()
/
pop()
события.
На данный момент существует три режима распределения (поведения), распознаваемых методом on_motion в классе Widget
:
Режим распределения по умолчанию (требует
MODE_DEFAULT_DISPATCH
) - событие будет проходить через список дочерних виджетов, начиная с первого виджета в списке, пока событие не будет принято или не будет достигнут последний виджет, зарегистрированный для этого события. РежимMODE_DEFAULT_DISPATCH
назначается по умолчанию в классеMotionEvent
.Режим фильтрации распределения (требует
MODE_FILTERED_DISPATCH
) - событие будет проходить только через зарегистрированные дочерние виджеты.Режим отсутствия распределения дочерним виджетам (требует
MODE_DONT_DISPATCH
) - событие не будет передаваться дочерним виджетам.
Обратите внимание, что у окна нет свойства motion_filter, и поэтому оно не имеет списка отфильтрованных виджетов из своего списка children.
- Класс kivy.eventmanager.EventManagerBase[исходный код]¶
Базовый класс с методами
start()
,stop()
иdispatch()
, предназначенными для реализации в конкретном классе.Пример менеджера, принимающего события касания и наведения:
class TouchHoverManager(EventManagerBase): type_ids = ('touch', 'hover') def start(self): # Создать дополнительные ресурсы, привязать обратные вызовы к self.window def dispatch(self, etype, me): if me.type_id == 'touch': # Обработать событие касания elif me.type_id == 'hover' # Обработать событие наведения def stop(self): # Освободить ресурсы
- dispatch(etype, me)[исходный код]¶
Распределить событие me в виджеты в
window
.- Parameters
- etype: str
Один из “begin”, “update” или “end”
- me:
MotionEvent
Текущее событие движения, которое передается.
- Returns
bool True, чтобы остановить передачу событий
New in version 2.1.0.
- start()[исходный код]¶
Запускает менеджер, привязывает обратные вызовы к объектам и создает дополнительные ресурсы. Атрибут
window
присваивается, когда этот метод вызывается.Добавлено в версии 2.1.0.
- stop()[исходный код]¶
Останавливает менеджер, отвязывается от объектов и освобождает все выделенные ресурсы.
Добавлено в версии 2.1.0.
- type_ids = None¶
Переопределите этот атрибут, чтобы объявить идентификаторы типов событий, которые менеджер хочет получать. Этот атрибут будет использоваться
WindowBase
для определения, какие события передавать в методdispatch()
.Добавлено в версии 2.1.0.
- window = None¶
Содержит экземпляр класса
WindowBase
.Добавлено в версии 2.1.0.
- kivy.eventmanager.MODE_DEFAULT_DISPATCH = 'default'¶
Назначьте этот режим, чтобы событие передавалось через список дочерних виджетов, начиная с первого виджета в списке, пока событие не будет принято или не будет достигнут последний зарегистрированный виджет для этого события. Виджеты после последнего зарегистрированного виджета игнорируются.
Добавлено в версии 2.1.0.
- kivy.eventmanager.MODE_DONT_DISPATCH = 'none'¶
Назначьте этот режим, чтобы предотвратить передачу события дочерним виджетам.
Добавлено в версии 2.1.0.