【问题标题】:why does tkinter / window.update get slower over time within my program?为什么 tkinter / window.update 在我的程序中随着时间的推移变慢?
【发布时间】:2017-04-30 21:21:46
【问题描述】:

我发现当我调用 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()

【问题讨论】:

    标签: python python-3.x tkinter


    【解决方案1】:

    简答:

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

    详细解答:

    while 条件无限期满足。

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

    这意味着:

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

    结论

    你得到了你想要的。

    另类

    如果您想无限期地只绘制 99 个椭圆,请删除您之前创建的每个 99 个椭圆。这意味着,您可以在canvas.update() 正下方添加canvas.delete(ALL)

    【讨论】:

    • 谢谢!这对我提出了另一个问题。当我将 canvas.delete(ALL) 放在那里时,它会使屏幕变白。但在这种情况下和其他一些情况下,我只是希望我可以保留之前绘制的所有其他像素。但是将它们全部保留在那里当然会导致延迟。此显示功能需要完全“跟踪”先前绘制的每个形状。如果我只是想让 python 将由新形状引起的新像素放置在先前绘制的像素之上……但没有仔细跟踪所有早期的圆圈怎么办?
    • 在这种情况下,甚至不要使用update()(也不要使用delete(ALL))并删除while 条件(或更改其条件)。
    • 并将每个椭圆坐标保存到一个列表中
    猜你喜欢
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    • 2014-02-04
    • 2018-09-10
    • 1970-01-01
    相关资源
    最近更新 更多