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()
我有一个带有 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()