为什么 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 后几乎立即退出。
首先,我知道 Tkinter 不是线程安全的,这个问题与此有关,但我想正式找出为什么这段代码会显示 window 但没有响应。
from Tkinter import *
root = Tk()
c = Canvas()
c.pack()
c.create_line(10,10, 30, 30)
root.update()
我想知道为什么会崩溃。我知道最后一行应该包含一个 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 后几乎立即退出。