@@ -101,6 +101,23 @@ def on_event(self, event_and_modifiers, callback, remove=False):
101
101
102
102
def fire_event (self , event , data = None ):
103
103
"""Manually trigger an event handler on the Python side."""
104
+ # note that a click event will trigger click.stop if that particular
105
+ # event+modifier is registered.
106
+ event_match = [k for k in self ._event_handlers_map .keys () if k .startswith (event )]
107
+ if not event_match :
108
+ raise ValueError (f"'{ event } ' not found in widget { self } " )
109
+
110
+ self ._fire_event (event_match [0 ], data )
111
+
112
+ def click (self , data = None ):
113
+ """Manually triggers the event handler for the 'click' event
114
+
115
+ Note that this does not trigger a click event in the browser, this only
116
+ invokes the Python event handlers.
117
+ """
118
+ self .fire_event ("click" , data or {})
119
+
120
+ def _fire_event (self , event , data = None ):
104
121
dispatcher = self ._event_handlers_map [event ]
105
122
# we don't call via the dispatcher, since that eats exceptions
106
123
for callback in dispatcher .callbacks :
@@ -109,7 +126,7 @@ def fire_event(self, event, data=None):
109
126
def _handle_event (self , _ , content , buffers ):
110
127
event = content .get ("event" , "" )
111
128
data = content .get ("data" , {})
112
- self .fire_event (event , data )
129
+ self ._fire_event (event , data )
113
130
114
131
115
132
class VueWidget (DOMWidget , Events ):
0 commit comments