繁体   English   中英

Matplotlib tkagg后端性能

[英]Matplotlib tkagg backend performance

我有一个可以绘制大量数据的tkinter应用程序,当画布上有大量数据时,我注意到平移和缩放性能不佳。

查看tkagg_backend( 由此和其他几个问题所建议),函数和文档表明只有在用户空闲时才应重绘画布。 但是,从当前和以前的经验来看,画布一直在更新(重绘)mid zoom / pan。 因此,我正在研究所涉及的具体功能,并对此提出疑问。

dynamic_update函数:

def dynamic_update(self):
    'update drawing area only if idle'
    # legacy method; new method is canvas.draw_idle
    self.canvas.draw_idle()

canvas.draw_idle()函数:

def draw_idle(self):
    'update drawing area only if idle'
    if self._idle is False:
        return

    self._idle = False

    def idle_draw(*args):
        try:
            self.draw()
        finally:
            self._idle = True

    self._idle_callback = self._tkcanvas.after_idle(idle_draw)

._idle参数在后端初始化为True 这一点是我陷入困境的地方,因为我无法理解._idle是如何与鼠标活动相关联的(我假设它是,如果那是错的,请纠正我)。

有趣的是,画布的行为就像我期望的那样,通过注释self.canvas.draw_idle()行(一旦鼠标按钮被按下时重绘),从而不调用整个draw_idle函数。

因此,我的问题是如何设置_idle或为什么在我不idle时重绘整个画布?

当引用“空闲”时,它不是用户或他的鼠标活动,而是GUI主循环。 如果主循环当前不忙,则只应重绘画布。 这里,当然self._idle只引用GUI的matplotlib部分,而draw_idle这个结构应该做的是防止画布在绘制时被绘制。

平移或缩放时很容易发生这种情况。 鼠标移动到新位置,导致重新绘制。 当重绘正在进行时,鼠标已经进一步移动并导致下一次重绘。 在那个时间点,第一次重绘可能尚未完成,因此它将排队。 等等,这样在某些时候GUI可能会变得没有响应。 为了防止这种情况,只有在前一个绘制完成后才会初始化新绘制,并且self._idle为true或false引导此行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM