我正在使用matplotlib:
假设我有一个对象A,它有两个属性B和C,还有一个绘制图形的方法。B和C都有在事件"motion_notify_event"上对图形做一些事情的方法。
我注意到这两种方法不能同时工作,而且似乎存在冲突。
如何处理这种情况?
因此,我编写了一个代码,它比上面的解释更好地显示了这个问题。
import matplotlib.pyplot as plt
from matplotlib.widgets import MultiCursor
from matplotlib.patches import Circle
class Event1(object):
def __init__(self,axes):
self.fig = axes[0].figure
self.axes = axes
self.eid = self.fig.canvas.mpl_connect('motion_notify_event',self.onmove)
def onmove(self,event):
for ax in self.axes:
c = Circle((event.xdata,event.ydata),radius=0.05)
ax.add_patch(c)
ax.draw_artist(c)
self.fig.canvas.blit(self.fig.bbox)
class plotclass(object):
def __init__(self):
pass
def plotme(self):
self.fig = plt.figure()
self.ax1 = self.fig.add_subplot(211)
self.ax2 = self.fig.add_subplot(212)
for ax in (self.ax1,self.ax2):
ax.set_xlim((0,10))
ax.set_ylim((0,10))
# self.curs = MultiCursor(self.fig.canvas,(self.ax1,self.ax2))
self.ev1 = Event1((self.ax1,self.ax2))
self.fig.show()
def main():
pc = plotclass()
return pc
if __name__ == '__main__':
main()
现在,在这段代码中,有两个东西在监听motion\notify_event:类Event1,它将在光标位置绘制圆圈,类"plotclass",它创建图形并在光标位置画光标。
我已经评论了self.curs=。。。,当鼠标移动时,我会看到圆圈,但如果取消注释,我只会看到光标:为什么?以及如何看到两者?
为了详细说明我上面的评论,这不是由于多个事件处理,而是由于不同阶段的blitting相互覆盖。
Blitting通常通过恢复保存的、完全渲染的状态,然后在其上绘制来工作
在您当前的代码中,您正在进行闪电战,但没有恢复保存的状态,因此您会得到一条圆圈的"轨迹"(大概这就是您想要的)。
但是,MultiCursor
在绘制自身之前调用fig.canvas.restore_region(...)
(否则会有一条线的"轨迹")。因此,它会在您刚刚绘制的图形上恢复一个保存的"空白"图形。
如果你想使用多次闪电战,它们需要相互协调。有很多不同的方法来处理这一问题,但对于大多数用例来说,它们都是过度的。快速解决方案是将useblit=False
传递给MultiCursor
。但是,这会减慢渲染速度。
你能详细说明一下你想做什么吗?你只想要一个在鼠标位置有一个圆圈的光标吗?(如果是,只需将MultiCursor
子类化。)