[英]How to end threads when closing window in 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()
有什么方法可以殺死線程嗎? 現在,當我關閉窗口時,腳本仍然在后台運行。
任何幫助將不勝感激!
謝謝,
約翰
如果將線程設置為守護程序線程,它將與主線程一起死亡。
您可以通過在調用start之前添加行t2.daemon = True
來執行此操作
編輯 :檢查此示例,使用t.daemon = True
行,當您關閉框架時線程會死亡,如果您注釋掉t.daemon = True
line,則線程在框架關閉后保持活動狀態
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()
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.