关闭线程的Tkinter窗口

2 投票
1 回答
3885 浏览
提问于 2025-04-16 23:16

我用Tkinter窗口来显示我程序的一些输出。这个窗口是线程化的(下面有基本结构),基本上运行得还不错。目前,我只遇到一个问题,就是关闭窗口。当我点击窗口右上角的“X”按钮时,窗口可以正常关闭。

但是,当我从启动监控线程的主程序中调用Monitor.close()方法时,窗口就会卡住(比如,点击“X”按钮没有反应),而监控线程还在继续运行。因此,主程序也无法退出。

所以,现在我必须先手动点击关闭按钮来关闭窗口,然后再关闭主程序。这不是个大问题,但如果主程序能够自己关闭窗口就好了。有谁能给点建议吗?

谢谢,祝好,

Christian

class Monitor(threading.Thread):

    def __init__(self):
        threading.Thread.__init__(self)
        self.start()

    def close(self):
        self.root.quit()
        self.root.destroy()

    def run(self):
        self.root=Tkinter.Tk()
        self.root.protocol("WM_DELETE_WINDOW", self.close)
        self.root.mainloop()

1 个回答

3

在这种情况下,Python的线程和Tk(inter)不太兼容,因为它们违反了Tcl/Tk的线程模型,Tcl/Tk要求只能从一个线程中使用Tk。

不过,使用消息传递的方式效果很好,只是不能直接从一个线程调用Tk。所以你需要通过队列(Queue)来添加一些消息传递的机制。

可以看看这个链接:http://effbot.org/zone/tkinter-threads.htm,里面有个例子。

撰写回答