2014-06-24 64 views
0

我想有一個按鈕開始執行一個文件,另一個按鈕停止執行。下面的代碼不起作用,文件繼續執行。 (在這種情況下,文件只是一個循環,不斷打印出「hello world」)。我怎樣才能達到我想要的?使用按鈕按下停止文件執行

import wx, sys 
from threading import Thread 
import time 


class mywxframe(wx.Frame): 

    def __init__(self): 
     wx.Frame.__init__(self,None) 
     pnl = wx.Panel(self) 
     szr = wx.BoxSizer(wx.VERTICAL) 
     pnl.SetSizer(szr) 
     szr2 = self.sizer2(pnl) 
     szr.Add(szr2, 1, wx.ALL|wx.EXPAND, 10) 
     log = wx.TextCtrl(pnl, -1, style= wx.TE_MULTILINE, size = (300, -1)) 
     szr.Add(log, 0, wx.ALL, 10) 
     btn3 = wx.Button(pnl, -1, "Stop") 
     btn3.Bind(wx.EVT_BUTTON, self.OnStop) 
     szr.Add(btn3, 0, wx.ALL, 10) 
     self.CreateStatusBar() 

     redir = RedirectText(log) 
     sys.stdout=redir 

     szr.Fit(self) 
     self.Show() 

    def sizer2(self, panel): 
     sizer = wx.BoxSizer(wx.HORIZONTAL) 
     self.tc2 = wx.TextCtrl(panel, -1, 'Set Range', size = (100, -1)) 
     btn2 = wx.Button(panel, -1, "OK",) 
     self.Bind(wx.EVT_BUTTON, self.OnStart, btn2) 
     sizer.Add(self.tc2, 0, wx.ALL, 10) 
     sizer.Add(btn2, 0, wx.ALL, 10) 
     return sizer 


    def OnStart(self, event): 
     our_thread = Thread(target = self.WorkerThread) 
     our_thread.start() 

    def OnStop(self, event): 
     self.dead = True 


    def WorkerThread(self): 
     self.dead = False 
     while (not self.dead): 
      execfile("P:\Computing and networking\Python\Learning programs\hello_world.py") 
      if self.dead: 
       break 
     print "aborting" 


class RedirectText(object): 
    def __init__(self, aWxTextCtrl): 
     self.out=aWxTextCtrl 

    def write(self, string): 
     wx.CallAfter(self.out.WriteText, string) 


app = wx.App() 
frm = mywxframe() 
app.MainLoop() 

回答

0

您的GUI變得無響應。這意味着你長時間運行的進程阻止了GUI的主循環。爲了使這個工作,你需要子類Thread。這裏是爲我工作的一個版本:

import wx, sys 
from threading import Thread 
import time 

class TestThread(Thread): 

    def __init__(self): 
     Thread.__init__(self) 
     self.dead = False 
     self.start() 

    def run(self): 
     while not self.dead: 
      print "hi" 
     print "aborted" 

class mywxframe(wx.Frame): 

    def __init__(self): 
     wx.Frame.__init__(self,None) 
     pnl = wx.Panel(self) 
     szr = wx.BoxSizer(wx.VERTICAL) 
     pnl.SetSizer(szr) 
     szr2 = self.sizer2(pnl) 
     szr.Add(szr2, 1, wx.ALL|wx.EXPAND, 10) 
     log = wx.TextCtrl(pnl, -1, style= wx.TE_MULTILINE, size = (300, -1)) 
     szr.Add(log, 0, wx.ALL, 10) 
     btn3 = wx.Button(pnl, -1, "Stop") 
     btn3.Bind(wx.EVT_BUTTON, self.OnStop) 
     szr.Add(btn3, 0, wx.ALL, 10) 
     self.CreateStatusBar() 

     redir = RedirectText(log) 
     #sys.stdout=redir 

     szr.Fit(self) 
     self.Show() 

    def sizer2(self, panel): 
     sizer = wx.BoxSizer(wx.HORIZONTAL) 
     self.tc2 = wx.TextCtrl(panel, -1, 'Set Range', size = (100, -1)) 
     btn2 = wx.Button(panel, -1, "OK",) 
     self.Bind(wx.EVT_BUTTON, self.OnStart, btn2) 
     sizer.Add(self.tc2, 0, wx.ALL, 10) 
     sizer.Add(btn2, 0, wx.ALL, 10) 
     return sizer 


    def OnStart(self, event): 
     self.our_thread = TestThread() 

    def OnStop(self, event): 
     self.our_thread.dead = True 


class RedirectText(object): 
    def __init__(self, aWxTextCtrl): 
     self.out=aWxTextCtrl 

    def write(self, string): 
     wx.CallAfter(self.out.WriteText, string) 

app = wx.App() 
frm = mywxframe() 
app.MainLoop() 

您可能想看看下面的資源,用於wxPython的和額外的信息主題:

+0

我嘗試了你的建議,但是按下停止按鈕後,執行的文件仍然繼續執行。這段代碼可以使用execfile命令嗎? – user3403418

+0

它應該。我只是嘗試在線程類的** run **方法中用** execfile(「hi.py」)**替換我的打印語句,並且它對我很有用。 –

+0

以任何方式做你的hi.py循環?我只是複製並粘貼你的代碼,添加了我的循環文件,並得到了相同的結果。該文件不會停止執行。 – user3403418