如何处理多个对象在同一图形上侦听motion_otify_events



我正在使用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子类化。)

相关内容

  • 没有找到相关文章

最新更新