Table Of Contents
Event Manager¶
The EventManagerBase
is the abstract class intended for specific
implementation of dispatching motion events
(instances of MotionEvent
) to widgets through
on_motion()
method of the
Widget
class.
Warning
This feature is experimental and it remains so while this warning is present.
Manager is a layer between the window and its widgets.
WindowBase
will forward all the events it receives
in on_motion()
method to the all managers
who declared to receive types of those events. Event will continue to go
through the managers list even if one of them accept it (by returning True).
When to use an event manager¶
Use a manager when you want to:
Dispatch touch, hover, keyboard, joystick or any other events to the widgets through
on_motion()
method.Dispatch filtered motion events by any criteria, like by a
device
or aprofile
.Combine several motion events (touch, hover etc.) into one new event and dispatch it to the widgets.
Dispatch one-time generic events, like app pause/resume.
Write an event simulator, like a touch simulator which draws a circle on window’s canvas for every simulated touch.
Defining and registering an event manager¶
Inherit
EventManagerBase
and set which events this manager should receive by declaring event types inEventManagerBase.type_ids
attribute.Implement
EventManagerBase.dispatch()
which will be called by window to pass event type (one of “begin”, “update”, “end”) and an event.Implement
EventManagerBase.start()
andEventManagerBase.stop()
to allocate and release additional resources if needed.Register a manager instance to window using method
register_event_manager()
. This can be done by overriding methodsbuild()
oron_start()
.
All registered managers are kept in the
event_managers
list. To unregister a
manager call unregister_event_manager()
which itself can be called in on_stop()
method.
Dispatching events to the widgets¶
Once registered, window will start the manager and forward all events of types
declared in EventManagerBase.type_ids
to the manager’s
EventManagerBase.dispatch()
method. It’s up to manager to decide how to
dispatch them, either by going through EventManagerBase.window.children
list and dispatching on_motion event or by using some different logic. It’s
also up to manager to dispatch grabbed events if grab feature is supported by
the event (see grab()
and
ungrab()
methods).
Manager can assign a different dispatch mode to decide how event
should be dispatched throughout the widget tree by changing the value of the
dispatch_mode
attribute. Before
changing the mode manager should store/restore the current one, either by using
a local variable or by using event’s
push()
/
pop()
methods.
Currently there are three dispatch modes (behaviors) recognized by the
on_motion method in Widget
class:
Default dispatch (requires
MODE_DEFAULT_DISPATCH
) - event will go through widget’s children list, starting with the first widget in the list until event gets accepted or last widget registered for that event is reached. ModeMODE_DEFAULT_DISPATCH
is assigned by default inMotionEvent
class.Filtered dispatch (requires
MODE_FILTERED_DISPATCH
) - event will go only through registered child widgets.No dispatch to children (requires
MODE_DONT_DISPATCH
) - event will not be dispatched to child widgets.
Note that window does not have a motion_filter property and therefore does not have a list of filtered widgets from its children list.
- class kivy.eventmanager.EventManagerBase[source]¶
Bases:
builtins.object
Abstract class with methods
start()
,stop()
anddispatch()
for specific class to implement.Example of the manager receiving touch and hover events:
class TouchHoverManager(EventManagerBase): type_ids = ('touch', 'hover') def start(self): # Create additional resources, bind callbacks to self.window def dispatch(self, etype, me): if me.type_id == 'touch': # Handle touch event elif me.type_id == 'hover' # Handle hover event def stop(self): # Release resources
- dispatch(etype, me)[source]¶
Dispatch event me to the widgets in the
window
.- Parameters:
- etype: str
One of “begin”, “update” or “end”
- me:
MotionEvent
The Motion Event currently dispatched.
- Returns:
bool True to stop event dispatching
New in version 2.1.0.
- start()[source]¶
Start the manager, bind callbacks to the objects and create additional resources. Attribute
window
is assigned when this method is called.New in version 2.1.0.
- stop()[source]¶
Stop the manager, unbind from any objects and release any allocated resources.
New in version 2.1.0.
- type_ids = None¶
Override this attribute to declare the type ids of the events which manager wants to receive. This attribute will be used by
WindowBase
to know which events to pass to thedispatch()
method.New in version 2.1.0.
- window = None¶
Holds the instance of the
WindowBase
.New in version 2.1.0.
- kivy.eventmanager.MODE_DEFAULT_DISPATCH = 'default'¶
Assign this mode to make event dispatch through widget’s children list, starting with the first widget in the list until event gets accepted or last widget registered for that event is reached. Widgets after the last registered widget are ignored.
New in version 2.1.0.
- kivy.eventmanager.MODE_DONT_DISPATCH = 'none'¶
Assign this mode to prevent event from dispatching to child widgets.
New in version 2.1.0.
- kivy.eventmanager.MODE_FILTERED_DISPATCH = 'filtered'¶
Assign this mode to make event dispatch only to child widgets which were previously registered to receive events of the same
type_id
and not to all child widgets.New in version 2.1.0.