update() 的主要目的是什么?为什么我的代码没有 update() 就不能工作?

What's the main purpose of update()? Why can't my code work without update()?

代码在 1920x1080 canvas

上缓慢生成随机选择的数字 1 和 0 的列
def matrix():
    c.configure(bg="black")
    numbers=[0,1]
    for i in range(100):
        for j in range(50):
            c.create_text(i*20,j*20,text=random.choice(numbers),fill="green")
            c.after(50)
            c.update() # <code>\<</code>------
matrix()

update() 的主要目的是什么?为什么没有 update() 我的代码就不能工作?

我环顾四周,但无法真正理解。你可以说我傻。

您的代码 无需调用 update 即可工作。只是你看不到它工作,因为你不让 tkinter 刷新 window。

为了让 tkinter(或任何 GUI 工具包)发挥作用,它必须能够响应稳定的事件流。诸如按钮单击、键入、调整 window 大小或绘制 canvas 之类的事件都会将事件添加到队列中。

通常这些事件是由事件循环处理的,mainloop就是这样。这是一个简单地等待事件到达,然后处理它们的循环。

因为tkinter是单线程的,一次只能做一件事。因此,只要您的代码正在做某事(例如:您的 for 循环),它就无法处理事件。如果它无法处理事件,则对 UI 的任何更改(例如 canvas 上的绘图)都将不可见。

当您调用 update 时,您请求 tkinter 处理所有滞留在事件队列中的未决事件。请注意,这会处理队列中的 all 个事件,因此如果您单击一个按钮,该单击也会得到处理。这可能会导致对 update 的一组深度嵌套调用,如果每次调用时,它都会处理一个导致它再次被调用的事件。

由于您不需要处理所有事件,而只是与刷新显示相关的事件,因此您可以改为调用 update_idletasks,它只处理 "idle" 事件。 "idle" 事件是 tkitner 在空闲时处理的事件。此类事件之一是刷新显示的请求。