为什么 Tkinter 中的更新方法会导致 window 冻结?

Why does the update method in Tkinter cause the window to freeze?

首先,我知道 Tkinter 不是线程安全的,这个问题与此有关,但我想正式找出为什么这段代码会显示 window 但没有响应。

from Tkinter import *
root = Tk()
c = Canvas()
c.pack()
c.create_line(10,10, 30, 30)
root.update()

我想知道为什么会崩溃。我知道最后一行应该包含一个 mainloop() 但是如果 说 mainloop 只是连续调用这两种方法,那么上面的代码没有理由没有响应。

update() 只处理一次事件。

mainloop()(顾名思义)就是一个不断处理事件的循环。

在您的代码中,您只调用了一次 root.update(),这就是您的程序变得无响应或终止的原因。

将对 root.update() 的调用置于 while 循环中,它将按预期工作:

while True:
    root.update()

但是,如果这能解决您的问题,您可能只想调用 root.mainloop()

它退出的原因(没有崩溃)是因为它已经完成了您要求它做的所有事情。您告诉它处理任何未决事件,然后像所有其他 python 程序一样,当它 运行 没有语句时,它会退出。

GUI 需要能够连续处理事件。在 tkinter 中,您可以通过调用根 window 的 mainloop 方法来实现。这不会 return (因此,你的程序不会退出)直到根 window 被销毁。

from Tkinter import *
root = Tk()
...
root.mainloop()

如果您的真实代码 运行在一个线程中,问题很可能是线程问题。当 运行 在单线程解释器中时,您问题中的确切代码将在显示根 window 后几乎立即退出。