def blocking_input_loop(figure, event_names, timeout, handler): """ Run *figure*'s event loop while listening to interactive events. The events listed in *event_names* are passed to *handler*. This function is used to implement `.Figure.waitforbuttonpress`, `.Figure.ginput`, and `.Axes.clabel`. Parameters ---------- figure : `~matplotlib.figure.Figure` event_names : list of str The names of the events passed to *handler*. timeout : float If positive, the event loop is stopped after *timeout* seconds. handler : Callable[[Event], Any] Function called for each event; it can force an early exit of the event loop by calling ``canvas.stop_event_loop()``. """ if figure.canvas.manager: figure.show() # Ensure that the figure is shown if we are managing it. # Connect the events to the on_event function call. cids = [figure.canvas.mpl_connect(name, handler) for name in event_names] try: figure.canvas.start_event_loop(timeout) # Start event loop. finally: # Run even on exception like ctrl-c. # Disconnect the callbacks. for cid in cids: figure.canvas.mpl_disconnect(cid)