Ignore matplotlib cursor widget when toolbar widget selected?

Viewed 2444

I am using a cursor widget in an interactive Matplotlib plot like so:

cursor = Cursor(ax1, useblit=True, color='red', linewidth=1)
cid = fig.canvas.mpl_connect('button_press_event', on_click)

Works well. The on_click function takes the x,y click locations and does some supplemental plotting. Basic stuff.

When I activate the zoom tool I am also capturing the click. Is it necessary to bind an activate and deactivate key stroke to the widget a la the RectangleSelector example or does a method exist that knows the state of the toolbar items?

Example of the selector on/off from the RectangleSelector example:

def toggle_selector(event):
    if event.key in ['Q','q'] and toggle_selector.RS.active:
        toggle_selector.RS.set_active(False)
    if event.key in ['A', 'a'] and not toggle_selector.RS.active:
        toggle_selector.RS.set_active(True)
3 Answers

The accepted answer doesn't work anymore for matplotlib version 3.3 due to this commit. When using the standard NavigationToolbar2 you could use its mode property instead.

Example similar to ImportanceOfBeingErnest's answer:

import matplotlib.pyplot as plt

fig, ax = plt.subplots()

def on_click(evt):
    state = fig.canvas.manager.toolbar.mode
    if state == '':
        print("no tool selected")
    else:
        print(f"{state} selected")

cid = fig.canvas.mpl_connect('button_press_event', on_click)

plt.show()

Since the toolmanager toolbar is available for more backends now, it might be useful here.

import matplotlib.pyplot as plt
plt.rcParams['toolbar'] = 'toolmanager'

fig, ax = plt.subplots()

def on_click(evt):
    state = fig.canvas.manager.toolbar.toolmanager.active_toggle["default"]
    if state is None:
        print("no tool selected")
    else:
        print(f"{state} selected")

cid = fig.canvas.mpl_connect('button_press_event', on_click)

plt.show()
Related