我正在尝试使用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()
有什么方法可以杀死线程吗?现在,当我关闭窗口时,脚本仍在后台运行。
非常感谢任何帮助!
谢谢,
约翰
答案 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