我有一个可以绘制大量数据的tkinter应用程序,当画布上有大量数据时,我注意到平移和缩放性能不佳。
查看tkagg_backend(由this和其他几个问题建议),函数和文档表明只有在用户空闲时才应重绘画布。但是,从当前和以前的经验来看,画布一直在更新(重绘)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
时重绘整个画布?
答案 0 :(得分:3)
当引用“空闲”时,不是用户或他的鼠标活动,而是GUI主循环。如果主循环当前不忙,则只应重绘画布。在这里,当然self._idle
只引用了GUI的matplotlib部分,draw_idle
中的这个结构应该做的是防止画布在绘制时被绘制。
平移或缩放时很容易发生这种情况。鼠标移动到新位置,导致重新绘制。当重绘正在进行时,鼠标已经进一步移动并导致下一次重绘。在那个时间点,第一次重绘可能尚未完成,因此它将排队。等等,这样在某些时候GUI可能会变得没有响应。为了防止这种情况,只有在前一个绘制完成后才会初始化新绘制,并且此行为由self._idle
引导为真或假。