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处理程序将始终被触发,但您只能在检测到正确的按钮时执行操作。