Python 关闭螺纹Tkinter窗口
我使用Tkinter窗口来可视化程序的一些输出。窗口是螺纹的(见下面的基本结构),基本上工作得很好。到目前为止,我只是关不上窗户。当我点击“X”按钮关闭窗口时,它会工作 但是,当我从启动监视器线程的主程序调用Monitor.close()方法时,窗口会冻结(例如,单击“X”按钮时它不会做出反应),线程监视器会继续运行。因此,主程序不会退出 因此,目前,我还必须首先通过单击关闭按钮“手动”关闭窗口,然后单击主程序。这不是一个大问题,但如果主程序可以自己关闭窗口,那就太好了。有什么提示吗 谢谢并致以最良好的祝愿 基督教徒Python 关闭螺纹Tkinter窗口,python,multithreading,tkinter,Python,Multithreading,Tkinter,我使用Tkinter窗口来可视化程序的一些输出。窗口是螺纹的(见下面的基本结构),基本上工作得很好。到目前为止,我只是关不上窗户。当我点击“X”按钮关闭窗口时,它会工作 但是,当我从启动监视器线程的主程序调用Monitor.close()方法时,窗口会冻结(例如,单击“X”按钮时它不会做出反应),线程监视器会继续运行。因此,主程序不会退出 因此,目前,我还必须首先通过单击关闭按钮“手动”关闭窗口,然后单击主程序。这不是一个大问题,但如果主程序可以自己关闭窗口,那就太好了。有什么提示吗 谢谢并致以
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()
以这种方式使用的Python线程和Tk(inter)不能很好地混合,因为它们违反了仅从一个线程使用Tk的Tcl/Tk线程模型
不过,它在消息传递方面非常有效,只是不适用于来自线程的直接调用。所以,您需要在这个队列中添加一些通过队列传递的消息
请看一个例子。谢谢你的回答,我会注意的!(对我来说)有趣的是,其他一切都很好,例如,从主程序调用a draw()方法。线程问题与往常一样。事情似乎进展顺利,直到他们因为遇到一些时间问题、竞争条件、数据损坏或死锁而停止这样做。Tcl/Tk有一个非常好的线程模型(基于消息传递,没有共享状态或GIL),而Python使用不同的模型,具有共享状态和锁,就像GIL一样无处不在。混合这两种方法可以奏效,但有时不行。谢谢你在这方面的详细阐述!mtTkinter-Tkinter的线程安全版本: