退出tk窗口时线程不会关闭

时间:2013-12-20 17:59:50

标签: python tkinter

我有一个用Python编写的应用程序,使用Tkinter。其中一个功能允许打开串行端口,之后通过串行端口接收的任何消息都显示在文本窗口中。这很好用。当我关闭窗口时,问题就来了,这不会杀死监视串口的线程。然后必须手动杀死(或者,拔掉USB串行电缆会导致异常,从而导致进程终止)。

我假设我在这里遗漏了一些简单的东西,但是我认为关闭应用程序会关闭所有相关的线程。我似乎无法在文档中找到任何相关内容,但我可能在错误的地方找到了什么?

串口线程的代码,如果它是相关的:

class SerialThread(threading.Thread):

    def __init__(self, queue, sp):
        threading.Thread.__init__(self)
        self.queue = queue
        self.ser_handle = sp;

    def run(self):
        while True:
            if self.ser_handle.inWaiting():
                text = self.ser_handle.readline(self.ser_handle.inWaiting())
                self.queue.put(text)
            time.sleep(0.2) 

1 个答案:

答案 0 :(得分:2)

您必须有办法让线程停止,您可以使用threading.Event来完成此操作。

class SerialThread(threading.Thread):

    def __init__(self, queue, sp):
        threading.Thread.__init__(self)
        self.queue = queue
        self.event = threading.Event() # An event object.
        self.ser_handle = sp;

    def stop(self):
        self.event.set()

    def run(self):
        while not self.event.isSet():
            if self.ser_handle.inWaiting():
                text = self.ser_handle.readline(self.ser_handle.inWaiting())
                self.queue.put(text)
            time.sleep(0.2) 

然后在窗口的关闭事件中,请致电your_thread.stop()