Noteamini
Noteamini

Reputation: 13

How to end threads when closing window in wxpython

I am trying to build an GUI application with wxPy that perform some long scripted action. I have put the GUI and the script in different threads to prevent blocking. this worked well except after I close the GUI, the thread containing the script remain running.

below is a simplified version of my program(sorry if the code is hard to understand or missing parts, I am terrible at shortening programs)

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()

Is there any way I can just kill the thread? right now the script still runs in background when I close the window.

Any help would be greatly appreciated!

Thanks,

John

Upvotes: 1

Views: 3405

Answers (2)

user1446258
user1446258

Reputation:

Python doesn't support killing/destroying threads, probably because memory leaks, resources loss, etc.

try this "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__)

You may run GUI as:(and try closing)

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

Upvotes: 1

GP89
GP89

Reputation: 6740

If you set the thread to be a daemon thread, it will die with the main thread.

You can do this by adding the line t2.daemon = True before you call start

Edit: Check this example, with the t.daemon = True line the thread dies when you close the frame, if you comment out that t.daemon = True line, the thread stays alive after the frame closes

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()

Upvotes: 3

Related Questions