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)
That isn't public state, but you can check
fig.canvas.manager.toolbar._active is None
which will be True
if the toolbar is not trying to grab clicks (either through pan or zoom).
You are reaching in and touching internal state which can change at any time, so use this at your own risk. The developers have no compunction about changing anything that starts with a _*
with no deprecation period.
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()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With