Matplotlib:如何仅在单击鼠标左键按下事件时调用拾取事件?

Matplotlib:如何仅在单击鼠标左键按下事件时调用拾取事件?,matplotlib,handler,interactive,picker,Matplotlib,Handler,Interactive,Picker,我有一个简单的交互式绘图,带有按钮按下事件和拾取事件处理程序: 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 cl

我有一个简单的交互式绘图,带有按钮按下事件和拾取事件处理程序:

    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\u handler()

给定的代码行为不符合预期,出现了一些奇怪的情况

1) 当绘图出现并且我在绘图中的任何位置进行第一次左键单击时,将调用
单击处理程序()
,并执行
打印“单击处理程序通过左键单击调用!”
,但不会调用
拾取处理程序()
;仅从第二次左键单击开始调用
拾取处理程序()

2) 当我在绘图中的任意位置执行第二次和任何进一步的左键单击时,
click\u handler()
首先调用
pick\u handler()
,然后才执行
print“click\u handler called by left click!”
,但根据代码,它应该反之亦然

3) 当绘图出现时,我的第一次单击是在绘图中的任意位置单击鼠标右键(这里的意思是,即使我右键单击某些
Line2D
对象),代码也会正常工作–它只调用
click\u handler()
并执行
print“click\u handler by right-click!”
。但是,如果我的第一次单击是在绘图中的任意位置左键单击,第二次单击是在绘图中的某个
Line2D
对象上右键单击,那么代码将调用
单击处理程序()
单击处理程序()
首先调用并完全执行
拾取处理程序()
,然后执行
打印“单击鼠标右键调用的\u处理程序!“
,但根据代码,任何右键单击都不应调用
拾取处理程序()


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

我认为下面的代码正符合您的要求:

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

那已经很好了,谢谢!你的建议中还有一个表面上的错误。如果我右键单击绘图中的
Line2D
对象,则
拾取处理程序()
仍然被调用,因为执行了
print
语句。这不会打扰我,但出于好奇,我想问一下——我们是否可以完全避免调用
pick\u处理程序()
进行任何右键单击?不,pick\u处理程序将始终被触发,但您只能在检测到正确的按钮时执行操作。