Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python非阻塞GUI启动和停止脚本/模块_Python_Multithreading_User Interface_Module_Wxpython - Fatal编程技术网

Python非阻塞GUI启动和停止脚本/模块

Python非阻塞GUI启动和停止脚本/模块,python,multithreading,user-interface,module,wxpython,Python,Multithreading,User Interface,Module,Wxpython,我希望能够从我的GUI运行和停止脚本/模块,而不阻塞它。我学习了一些关于在GUI代码中执行线程和运行“简单”长任务的基本知识。然而,所有的例子都是关于简单的while或for循环,这些循环可以被中止。在大多数情况下,这是某种计数 所以问题是:如何使用基于wx.python的GUI运行/停止外部脚本/模块?脚本没有什么特别之处,它可以是任何类型的长任务 下面是基本的wx.Python示例代码 import wx class MyApp (wx.App): def OnInit(self)

我希望能够从我的GUI运行和停止脚本/模块,而不阻塞它。我学习了一些关于在GUI代码中执行线程和运行“简单”长任务的基本知识。然而,所有的例子都是关于简单的
while
for
循环,这些循环可以被中止。在大多数情况下,这是某种计数

所以问题是:如何使用基于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()

您正在调用的脚本将需要一些机制来彻底退出,否则您将不得不处理混乱。我将使用Python的子流程模块来启动外部脚本,然后在需要时使用psutil()之类的东西来终止它。这将要求您获取子流程的流程id(pid),并跟踪它,以便以后可以终止它


我在这里写了一个在wxPython中使用psutil的例子:

我在计数方面没有任何问题。我不会以简单的形式使用长时间运行的任务。我将使用一些外部脚本,所以我只需要一种方法来启动或停止按钮我的脚本。