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