python - Matplotlib tkagg 后端性能

标签 python performance matplotlib tkinter tkinter-canvas

我有一个 tkinter 应用程序,可以绘制大量数据,但我注意到当 Canvas 上有大量数据时,平移和缩放性能很差。

查看 tkagg_backend(如 this 和其他几个问题所建议的),函数和文档表明 Canvas 仅应在用户空闲时重新绘制。然而,根据当前和以前的经验, Canvas 始终在缩放/平移中更新(重绘)。因此,我正在研究所涉及的具体功能,并对此有疑问。

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 如何链接到鼠标事件(我认为是这样,如果这是错误的,请纠正我)。

有趣的是, Canvas 的行为就像我所期望的那样,通过注释 self.canvas.draw_idle() 行(松开鼠标按钮后重新绘制),因此不会调用整个 draw_idle 函数。

因此,我的问题是_idle是如何设置的,或者为什么当我不idle时它会重绘我的整个 Canvas ?

最佳答案

当提到“空闲”时,并不是指用户或其鼠标事件,而是指 GUI 主循环。仅当主循环当前不忙时才应重绘 Canvas 。当然,这里 self._idle 仅指 GUI 的 matplotlib 部分,而 draw_idle 内部的这个结构应该做的是防止 Canvas 在绘制时被绘制。正在绘制。

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

关于python - Matplotlib tkagg 后端性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44416336/

相关文章:

python - 关于 sns.barplot 及其工作原理的问题?

python - 在不重新绘制整个图形的情况下更新图形上的艺术家 (Line2D) - axes.draw_artist() 崩溃

python - 从 App Engine 中的 URL Fetch 调用的 Google API 的 API key 限制

python - 对以小写字母或大写字母开头的带重音符号的名称进行排序

java - 哪种功能组合方式最专业

c++ - 哪个更好,单 for 循环或双 for 循环迭代二维数组? C++

c# - 哪种方式可以将自定义类型保存到移动设备上的文件中?

python - 使用字符串而不是字母更新 python 中的计数器集合

Python:为什么 dict.fromkeys 方法不生成工作字典

python - 散点图中的黑点