2013-03-01 58 views
0

我希望能夠運行並停止來自我的GUI的腳本/模塊而不會阻塞它。我學習了一些關於在GUI代碼中線程化並執行「簡單」長任務的基本知識。然而,所有的例子都是關於簡單的whilefor循環,可以中止。在大多數情況下,這是一種計數。Wx.Python非阻塞GUI啓動和停止腳本/模塊

所以問題是:如何使用基於wx.python的GUI來運行/停止外部腳本/模塊?腳本沒什麼特別,它可以是任何類型的長期任務。

這裏是基本的wx.Python示例代碼!

import wx 

class MyApp (wx.App): 
    def OnInit(self): 
     self.frame = MyFrame(None, title = 'Example') 
     self.SetTopWindow(self.frame) 
     self.frame.Show() 

     return True 

class MyFrame(wx.Frame): 
    def __init__(self, parent, title): 
     wx.Frame.__init__(self, parent, title=title ,style = (wx.MINIMIZE_BOX | wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX | wx.CLIP_CHILDREN)) 

     button1 = wx.Button(self,-1,'Start') 
     button2 = wx.Button(self,-1, 'Stop') 
     self.gauge1 = wx.Button(self, -1) 

     box = wx.BoxSizer(wx.VERTICAL) 

     box.Add(button1,1, wx.ALL, 10) 
     box.Add(button2,1, wx.ALL, 10) 
     box.Add(self.gauge1,1,wx.EXPAND|wx.ALL,10) 

     self.SetSizer(box, wx.EXPAND) 

     self.Bind(wx.EVT_BUTTON, self.OnStart, button1) 
     self.Bind(wx.EVT_BUTTON, self.OnStop, button2) 

    def OnStart(self,e): 
     pass 


    def OnStop(self,e): 
     pass 


if __name__=='__main__': 
    app = MyApp(False) 
    app.MainLoop() 
+0

我沒有與計數任何問題。我不會以簡單的形式使用長時間運行的任務。我將使用一些外部腳本,所以我只需要一種方法來啓動或停止使用按鈕的腳本。 – Domagoj 2013-03-01 13:44:12

回答

1

您正在調用的腳本需要一些乾淨的退出機制,否則您只需要處理這個混亂。我會使用Python的子進程模塊來啓動外部腳本,然後使用類似psutil(https://github.com/giampaolo/psutil)的東西來殺死它,如果我需要的話。這將需要你用子進程獲取進程ID(pid)並跟蹤它,以便稍後可以殺死它。

我寫了在wxPython中使用psutil這裏的一個例子:http://www.blog.pythonlibrary.org/2012/07/13/wxpython-creating-your-own-cross-platform-process-monitor-with-psutil/