【问题标题】:Matplotlib: how to call a pick_event only upon a left-click button_press_event?Matplotlib:如何仅在左键单击 button_press_event 时调用 pick_event?
【发布时间】:2020-05-31 12:26:47
【问题描述】:

我有一个带有 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 对象),代码也会正确运行——它只是调用@987654331 @ 并执行 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】:

    我认为下面的代码正在做你想做的事:

    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 对象,仍会调用 pick_handler(),因为执行了 print 语句。这并没有打扰我,但出于好奇让我问一下——我们可以完全避免调用pick_handler() 来进行任何右键单击吗?
    • 不,pick_handler 将始终被触发,但您只能在检测到正确按钮时采取行动。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-02
    • 1970-01-01
    • 2022-01-19
    • 2019-08-22
    • 1970-01-01
    • 2015-03-19
    • 1970-01-01
    相关资源
    最近更新 更多