如何在wxpython中关闭窗口时结束线程

时间:2012-09-12 20:21:11

标签: python multithreading wxpython

我正在尝试使用wxPy构建一个GUI应用程序,它执行一些长脚本操作。我已将GUI和脚本放在不同的线程中以防止阻塞。这很好用,除非我关闭GUI后,包含脚本的线程仍在运行。

下面是我的程序的简化版本(对不起,如果代码难以理解或缺少部分,我很难缩短程序)

class Form(wx.Frame):
    ...
    def test(self, evt):
        t2 = threading.Thread(target = self.runTest)
        t2.start()
    def runTest(self):
       result = really_long_script()

def main():
   app = wx.App(False)
   form = form(app)
   app.MainLoop()

t1 = threading.Thread(target = main)
t1.start()

有什么方法可以杀死线程吗?现在,当我关闭窗口时,脚本仍在后台运行。

非常感谢任何帮助!

谢谢,

约翰

2 个答案:

答案 0 :(得分:2)

如果将线程设置为守护程序线程,它将与主线程一起消失。

您可以在致电开始

之前添加行t2.daemon = True来执行此操作

修改: 检查此示例,当您关闭框架时,线程会因t.daemon = True行而死,如果您注释掉t.daemon = True行,则线程在框架关闭后保持活动状态

import wx
import time
from threading import Thread

def print_something_forever(something):
    while True:
        print something
        time.sleep(1)

class Frame(wx.Frame):
    def __init__(self,parent):
        wx.Frame.__init__(self,parent)
        self.panel= wx.Panel(self)
        t= Thread(target=print_something_forever,args=("Thread alive!",))
        t.daemon= True
        t.start()
        self.Show()

if __name__ == "__main__":
    app= wx.App(False)
    Frame(None)
    app.MainLoop()

答案 1 :(得分:1)

Python不支持杀死/销毁线程,可能是因为内存泄漏,资源丢失等等。

试试这个“Threadizing class”:D

class Run_Other_Thread(threading.Thread):
      "Raises a child thread \
       I'm busy dying, rather lying - _P0W !"
      def __init__(self,func_name,*args): #Constructor
            self._func=func_name
            self._func_args=args
            threading.Thread.__init__(self)
      def run(self): # Start Dying
            try:
                print("\n** Running New Thread :"+self._func.func_name)
            except:
                print("\n** Running New Thread :"+self._func.__name__)
            self._func(*self._func_args)
      def stop(self):
            print('!! Stopped')
      def __del__(self):#Constructor
            try:
                print('\n  @@ Farewell :'+self._func.func_name)
            except:
                print('\n  @@ Farewell :'+self._func.__name__)

您可以将GUI运行为:(并尝试关闭)

def GUI():
    app= wx.App(False)
    Frame(None)
    app.MainLoop()

if __name__ == '__main__':
      "Tkinter GUI in Thread helps in De-bugging"
      Run_Other_Thread(GUI).start() # Release command window control