从Python中的其他线程终止主线程

时间:2017-03-10 22:55:19

标签: python multithreading

如何从线程终止程序?如果无法连接到服务器并且用户点击取消,我想终止整个程序。

class Client(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)

        t = threading.Thread(target = self.connect)
        t.setDaemon(True)
        t.start()

        def connect(self):
                try:
                    r.connect( "localhost", 28015)
                    self.refresh_objects()
                except r.ReqlDriverError as e:
                    self.db_exception_handler()

        def db_exception_handler(self):
                if(tk.messagebox.askretrycancel('ERROR','ERROR: Unable to connect to the database.')):
                    try:
                        r.connect( "localhost", 28015)
                    except r.ReqlDriverError as e:
                        self.db_exception_handler()
                else:
                    root.destroy() #I want to terminate here the program
                    #I tried: threading.main_thread().destroy() but not working

def main():
    root = tk.Tk()
    root.title("IOT_LPS_Client")
    cln = Client(master=root)
    cln.mainloop()
    try:
        root.destroy()
    except:
        pass 

if __name__ == '__main__':
    main()

1 个答案:

答案 0 :(得分:1)

我强烈建议编写一个训练有素的关闭,其中线程通知主线程需要退出,主线程调用sys.exit。 [请注意,只有主线程sys.exit才会终止进程]。

This blog post讨论了围绕此问题的一些问题和解决方案。简而言之,您可以使用threading.Event()之类的东西将停止信号从任何线程传递到主线程。