File 使用按键停止文件执行

File 使用按键停止文件执行,file,wxpython,execution,File,Wxpython,Execution,我想有一个开始执行文件的按钮,还有一个停止执行的按钮。下面的代码不起作用,文件继续执行。(在本例中,该文件只是一个不断打印“hello world”的循环。)如何实现我想要的 import wx, sys from threading import Thread import time class mywxframe(wx.Frame): def __init__(self): wx.Frame.__init__(self,None) pnl = w

我想有一个开始执行文件的按钮,还有一个停止执行的按钮。下面的代码不起作用,文件继续执行。(在本例中,该文件只是一个不断打印“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()

您的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和线程的更多信息:


我尝试了您的建议,但在按下停止按钮后,已执行的文件仍将继续执行。这段代码可以与execfile命令一起工作吗?应该可以。我刚刚尝试在thread类的run方法中用execfile(“hi.py”)替换我的print语句,它对我起了作用。您的hi.py是否以任何方式循环?我只是复制并粘贴了你的代码,添加了我的循环文件,得到了相同的结果。文件未停止执行。否。您的示例没有说您在执行的外部文件中也有一个循环。如果在外部脚本中有一个无限循环,那么这将不起作用。您无法直接控制该外部文件。您需要能够以某种方式与它进行通信,可能是使用RabbitMQ或socket服务器之类的?i、 e.用按钮停止循环脚本?