为什么Tkinter中的更新方法导致窗口冻结?

时间:2015-06-22 15:16:07

标签: python tkinter tkinter-canvas

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

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

我想知道它崩溃的原因。我知道最后一行应该包含一个mainloop(),但如果this post表示mainloop只是连续调用这两种方法,则上述代码没有理由不响应。

2 个答案:

答案 0 :(得分:3)

update()只处理事件一次。

mainloop()(顾名思义)是一个连续处理事件的循环。

在您的代码中,您只需拨打root.update()一次,这就是您的程序无法响应或终止的原因。

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

while True:
    root.update()

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

答案 1 :(得分:1)

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

GUI需要能够持续处理事件。在tkinter中,您可以通过调用根窗口的mainloop方法来完成此操作。在根窗口被破坏之前,这不会返回(因此,程序不会退出)。

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

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