选择工具栏小部件时忽略matplotlib游标小部件?

时间:2013-12-20 20:05:14

标签: python matplotlib interactive

我在交互式Matplotlib图中使用了一个光标小部件,如下所示:

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

运作良好。 on_click函数获取x,y点击位置并进行一些补充绘图。基本的东西。

当我激活缩放工具时,我也在捕捉点击。是否有必要将激活和取消激活关键笔划绑定到RectangleSelector示例的窗口小部件,或者是否存在知道工具栏项状态的方法?

RectangleSelector示例中选择器打开/关闭的示例:

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 个答案:

答案 0 :(得分:8)

这不是公开状态,但您可以查看

fig.canvas.manager.toolbar._active is None

如果工具栏没有尝试抓取点击次数(通过平移或缩放),则为True

您正在接触并触及可随时更改的内部状态,因此使用此风险需要您自担风险。开发人员对于更改以_*开头并且没有弃用期的任何内容都没有任何意见。

答案 1 :(得分:1)

由于toolmanager工具栏现在可用于更多后端,因此在这里可能很有用。

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()

答案 2 :(得分:1)

由于accepted answerthis commit在matplotlib版本3.3中不再起作用。使用标准NavigationToolbar2时,可以使用其mode属性。

类似于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()