选择器事件处理程序对单个事件多次被调用
在我的Matplotlib图表中,我创建了一些圆形图形,当点击其中一个时,应该会在注释中显示一些信息。我基本的代码是可以工作的,但我发现即使只点击了一次,处理程序却被调用了多次。通常,我会用Python调试器来查找问题,但在Matplotlib的事件循环中,它却无法工作。
下面是这个事件的处理代码。artists参数是一个字典,以艺术家为键,值是一个数据结构。这些信息就是要放入注释中的内容。
def on_pick(event, artists):
artist = event.artist
print(f"pick event, {artist} class {artist.__class__}")
if artist in artists:
x = artist.center[0]
y = artist.center[1]
a = plt.annotate(f"{artists[artist].getX()}", xy=(x,y), xycoords='data')
artist.axes.figure.canvas.draw_idle()
print("done")
else:
print("on_pick: artist not found")
每个艺术家的picker属性都设置为True,并且on_pick函数被安装为选择事件的处理程序。当我运行程序时,图表被创建,我点击其中一个圆圈。正如预期的那样,我看到注释出现了,但随后处理程序又被调用了一次或多次,如下所示。
pick event, Circle(xy=(0.427338, 0.431087), radius=0.00287205) class <class 'matplotlib.patches.Circle'>
done
pick event, Circle(xy=(0.427338, 0.431087), radius=0.00287205) class <class 'matplotlib.patches.Circle'>
on_pick: artist not found
前两行是正确的,而后两行则是来自意外的第二次调用。我也很困惑,为什么艺术家没有被找到,因为它和第一次调用的完全一样。
你觉得可能发生了什么呢?
2 个回答
0
无法用以下内容重现这个问题,请提供一个可以重现的例子。
import matplotlib.pyplot as plt
from matplotlib.patches import Circle
fig, ax = plt.subplots()
circle1 = Circle((0, 0), 0.6, color="blue", fill=False)
circle2 = Circle((1, 1), 0.9, color="red", fill=False)
circle1.set_picker(True)
circle2.set_picker(True)
ax.add_patch(circle1)
ax.add_patch(circle2)
def on_pick(event):
print(f"Clicked on {event.artist}")
fig.canvas.mpl_connect("pick_event", on_pick)
ax.set_xlim(-1, 2)
ax.set_ylim(-1, 2)
ax.set_aspect("equal")
plt.show()
0
我找到了问题的原因。在其他代码中,当鼠标进入时,包含圆形的矩形被填充了,这样就把圆形遮住了,看不见了。于是,我在同样的位置重新创建了一个圆形的艺术家,这样一来,它就能出现在矩形里,而且还创建了第二个圆形的艺术家。当发生选择事件时,第一次调用处理函数时传递的是第一个艺术家的实例,而第二次调用时传递的是第二个。由于这个第二个圆形不在字典里,所以第二次查找的时候就失败了。简单来说,问题出在编码和逻辑错误上,而不是Matplotlib和选择器本身的问题。