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

问题描述 投票:1回答:1

我有一个带有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()绝不能通过任何右键单击来调用。

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

matplotlib handler interactive picker
1个回答
1
投票

我认为以下代码正在执行您想要的操作:

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()
© www.soinside.com 2019 - 2024. All rights reserved.