【问题标题】:Matplotlib tkagg backend performanceMatplotlib tkagg 后端性能
【发布时间】:2017-11-09 00:35:21
【问题描述】:

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

查看 tkagg_backend(如this 和其他几个问题所建议的那样),该函数和文档建议只有在用户空闲时才应重绘画布。但是,根据当前和以前的经验,画布一直在更新(重绘)中间缩放/平移。因此,我正在查看所涉及的具体功能并对此有疑问。

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 时它会重绘我的整个画布?

【问题讨论】:

    标签: python performance matplotlib tkinter tkinter-canvas


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2018-01-15
      • 2012-10-07
      • 2020-01-16
      • 2014-11-20
      • 2017-05-13
      • 1970-01-01
      • 2016-04-07
      • 2016-06-20
      • 2020-06-22
      相关资源
      最近更新 更多