Matplotlib:如何仅在左键单击 button_press_event 时调用 pick_event?

Matplotlib: how to call a pick_event only upon a left-click button_press_event?

我有一个带有 button_press_event 和 pick_event 处理程序的简单交互式图:

    fig, ax1 = plt.subplots()
    line, = ax1.plot(x, y, picker=10)

    def pick_handler(event):
        print "Pick_handler called!"
        if isinstance(event.artist, Line2D):
            # do something

    def click_handler(event):
        if event.button == 1:
            print "Click_handler called by left-click!"
            fig.canvas.mpl_connect('pick_event', pick_handler)
        if event.button == 3:
            print "Click_handler called by right-click!"
            # do something

    fig.canvas.mpl_connect('button_press_event', click_handler)
    plt.show()

所需的行为如下:仅当我在绘图中单击鼠标左键时,才应调用 pick_handler()

给定代码的行为不符合预期,发生了几件奇怪的事情。

1) 当绘图出现并且我第一次左键单击绘图中的任意位置时,将调用 click_handler() 并执行 print "Click_handler called by left-click!",但不会执行 pick_handler()称为;仅从第二次左键单击开始调用 pick_handler()

2) 当我在图中的任何地方进行第二次和任何进一步的左键单击时,click_handler() 首先调用 pick_handler(),然后才执行 print "Click_handler called by left-click!",但是根据代码,反之亦然。

3) 当绘图出现时,我的第一次点击是右键单击绘图中的任意位置(aynwhere 意味着即使我右键单击某个 Line2D 对象),代码也会正确运行——它只是调用 click_handler() 并执行 print "Click_handler called by right-click!"。但是,如果我的第一次点击是左键点击图中的任意位置,第二次点击是右键点击图中的某个 Line2D 对象,那么代码会调用 click_handler()click_handler() 首先调用并完全执行 pick_handler(),然后执行 print "Click_handler called by right-click!",但根据代码,不应通过任何右键单击调用 pick_handler()

是我的代码有误还是我对点击和选择处理程序的理解有误?

我认为以下代码可以满足您的要求:

fig, ax1 = plt.subplots()
line, = ax1.plot(x, y, 'o', picker=10)

def pick_handler(event):
    print("Pick_handler called!")
    if event.mouseevent.button==1 and isinstance(event.artist, Line2D):
        print("Do the thing.")

def click_handler(event):
    if event.button == 3:
        print("Click_handler called by right-click!")
        # do something

fig.canvas.mpl_connect('pick_event', pick_handler)
fig.canvas.mpl_connect('button_press_event', click_handler)
plt.show()