tkinter线程gui实例停止所有进一步的生成

时间:2010-12-29 14:08:10

标签: python multithreading tkinter

当我使用线程创建tkinter窗口实例时,即使窗口在执行后被销毁,并且线程已连接;我不能在程序流程中再创建另一个tkinter窗口。为什么呢?

def on_button_click(root):  //destroys window on button click
    root.destroy()

def init():  //thread calls this
    root=Tk()
    b = Button(root, text="OK", command=lambda:on_button_click(root))
    b.pack()
    root.mainloop()

t = Thread(target=init)
t.start()
t.join()

root=Tk() //program flow halts here with no window being displayed
root.mainloop()

1 个答案:

答案 0 :(得分:1)

根据我使用Google-foo收集的内容,问题是Tk事件循环(在您调用 root.mainloop()期间创建)是单线程的,您可以一次只有一个实例。所以这可能就是为什么它会卡在那个位置。您的线程正在正确设置Tk子系统,但是当您尝试创建第二个Tk子系统以同时运行时,程序将失败。您对 root.destroy()的调用只会破坏您创建的窗口而不是整个Tk子系统。

自从我使用Tk以来已经有一段时间但是我建议在你第一次启动程序时调用root.mainloop(),然后让你的函数只实例化Tk窗口,而不是整个Tk子系统。