Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 关闭螺纹Tkinter窗口_Python_Multithreading_Tkinter - Fatal编程技术网

Python 关闭螺纹Tkinter窗口

Python 关闭螺纹Tkinter窗口,python,multithreading,tkinter,Python,Multithreading,Tkinter,我使用Tkinter窗口来可视化程序的一些输出。窗口是螺纹的(见下面的基本结构),基本上工作得很好。到目前为止,我只是关不上窗户。当我点击“X”按钮关闭窗口时,它会工作 但是,当我从启动监视器线程的主程序调用Monitor.close()方法时,窗口会冻结(例如,单击“X”按钮时它不会做出反应),线程监视器会继续运行。因此,主程序不会退出 因此,目前,我还必须首先通过单击关闭按钮“手动”关闭窗口,然后单击主程序。这不是一个大问题,但如果主程序可以自己关闭窗口,那就太好了。有什么提示吗 谢谢并致以

我使用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的线程安全版本: