【问题标题】:Thread doesn't close on exiting tk window退出 tk 窗口时线程不会关闭
【发布时间】:2013-12-21 02:49:39
【问题描述】:

我有一个使用 Tkinter 用 Python 编写的应用程序。其中一项功能允许打开串行端口,之后通过串行端口接收到的任何消息都显示在文本窗口中。这工作正常。当我关闭窗口时问题就来了,它不会杀死监视串行端口的线程。然后必须手动终止它(或者,拔下 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) 

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

    你必须有办法让线程停止,你可以使用: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) 
    

    然后在你的窗口的on close事件中,调用your_thread.stop()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多