为什么tkinter / window.update会在我的程序中随时间变慢?

时间:2017-04-30 06:27:10

标签: python python-3.x tkinter

我发现当我调用window.update时,当窗口写入的内容较少时,操作速度会快得多,但后来,当我向窗口写入更多元素时,window.update需要更长的时间。

请参阅下面的代码。您可以看到它在更新窗口之前一次向屏幕100添加新的圈子。

我的问题是:为什么它会随着时间的推移变慢?一开始,刷新每秒发生很多次。半分钟后,它将每秒一次左右......

起初这对我来说似乎很奇怪,因为我认为只需更改要刷新的像素,然后刷新,每次都会保持相同的处理量。但后来我想......这件事继续“跟踪”并“解释”我之前放在窗户上的形状吗?

无论如何,你对它减速的原因有什么想法或答案吗?

from tkinter import *
from random import *
xsize=1000
ysize=1000
shapesize=10
window = Tk()
canvas = Canvas(window, width=xsize, height=ysize)
canvas.pack()
while True:
    for l in range(100):
        col=choice(['pink','green','orange','yellow','blue','purple','red','black','brown','gray'])
        x=randint(0,xsize)
        y=randint(0,ysize)

        canvas.create_oval(x,y,x+shapesize, y+shapesize, fill=col) 
    window.update()

1 个答案:

答案 0 :(得分:2)

简答:

这是由于您使用的算法的复杂性。

详细答案:

无限期地满足while条件。

for循环退出后,您要求画布重绘以前的所有椭圆。

这意味着:

  • while迭代1,画布重绘99个椭圆
  • while迭代2:画布重绘99 + 99个椭圆
  • while迭代3:画布重绘99 + 99 + 99个椭圆。
  • while迭代4:画布重绘99 + 99 + 99 + 99个椭圆。
  • ...
  • ... OMG !!!

结论

你得到了你所要求的。

替代

如果您想要无限制地仅绘制99个椭圆,则删除之前创建的每个99个椭圆。这意味着,您可以在canvas.delete(ALL)

下方添加canvas.update()