簡體   English   中英

如何在wxpython中關閉窗口時結束線程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM