2014-06-24 66 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