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

时间:2017-11-13 21:27:05

标签: python for-loop random tkinter tkinter-canvas

代码在1920x1080画布上慢慢生成随机选择的数字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()的情况下无法运行?

我环顾四周但却无法理解。你可以说我很蠢。

1 个答案:

答案 0 :(得分:3)

您的代码 无需调用update即可运行。只是因为你不能让tkinter刷新窗口而你无法看到它正常工作。

为了使tkinter(或任何GUI工具包)起作用,它必须能够响应稳定的事件流。诸如按钮点击,键入,调整窗口大小或绘制到画布之类的事情都会导致事件被添加到队列中。

通常这些事件由事件循环处理,这是mainloop。它是一个循环,只是等待事件到达,然后它处理它们。

因为tkinter是单线程的,所以一次只能做一件事。因此,只要您的代码正在执行某些操作(例如:您的for循环),它就无法处理事件。如果它无法处理事件,则对UI的任何更改(例如在画布上绘图)都不会显示。

当您致电update时,您正在请求tkinter处理卡在事件队列中的所有待处理事件。请注意,这会处理队列中的所有事件,因此如果您单击按钮,则也会处理该点击。如果每次调用,这会导致对update的深度嵌套调用,它会处理导致再次调用它的事件。

由于您想要的不是处理所有事件,而只是处理与刷新显示相关的事件,您可以调用仅update_idletasks来处理&#34;空闲&#34;事件。 &#34;空闲&#34;事件是tkitner在空闲时进行处理的事件。一个这样的事件是刷新显示的请求。