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 在空闲时处理的事件。此类事件之一是刷新显示的请求。
代码在 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 在空闲时处理的事件。此类事件之一是刷新显示的请求。