如何停止Pulse()函数(Python2.7、wxPython、EnhancedStatusBar)?

如何停止Pulse()函数(Python2.7、wxPython、EnhancedStatusBar)?,python,python-2.7,wxpython,Python,Python 2.7,Wxpython,我正在尝试为wxpythongui实现一个进度条。我使用了增强状态栏()。我的代码如下所示: for line in iter(proc.stdout.readline, ''): #Read stdout line by line self.gauge1.Pulse() wx.CallAfter(self.write_to_textctrl, line) #Appends line variable to TextCtrl 我试着在for循环之外执行self.gauge1.D

我正在尝试为wxpythongui实现一个进度条。我使用了增强状态栏()。我的代码如下所示:

for line in iter(proc.stdout.readline, ''): #Read stdout line by line
    self.gauge1.Pulse()
    wx.CallAfter(self.write_to_textctrl, line) #Appends line variable to TextCtrl

我试着在for循环之外执行self.gauge1.Destroy(),但没有成功。那么,当脉冲函数停止读取标准输出时,我该如何使其停止呢?我猜您的过程不会结束。您应该添加一个检查,查看
是否为空,并在那里中断循环。然后您可以在仪表上调用
Destroy()


请注意,除了您提到的小部件之外,wxPython还有
wx.Gauge
PyGauge
。您可能也想尝试其中一种方法。

我猜您的过程不会结束。您应该添加一个检查,查看
是否为空,并在那里中断循环。然后您可以在仪表上调用
Destroy()


请注意,除了您提到的小部件之外,wxPython还有
wx.Gauge
PyGauge
。您可能也想尝试其中一种方法。

下面是一个简单的状态栏示例,其中包含一个进度栏,以调用
ping
的子流程为例进行交互。
希望你能从中获得一些好处

import wx
import subprocess
class MainFrame(wx.Frame):

    def __init__(self):
        wx.Frame.__init__(self, None, title='Statusbar progress')
        panel = wx.Panel(self)
        start_btn = wx.Button(panel, label='Start')
        start_btn.Bind(wx.EVT_BUTTON, self.OnStart)
        stop_btn = wx.Button(panel, label='Stop')
        stop_btn.Bind(wx.EVT_BUTTON, self.OnStop)
        self.Bind(wx.EVT_CLOSE, self.OnExit)
        btn_sizer = wx.BoxSizer(wx.HORIZONTAL)
        btn_sizer.Add(start_btn)
        btn_sizer.Add(stop_btn)
        panel.SetSizer(btn_sizer)
        self.statusbar = self.CreateStatusBar(3)
        self.text1 = wx.StaticText(self.statusbar,-1,("Static text"))
        self.text2 = wx.StaticText(self.statusbar,-1,("Count Text"))
        self.progress_bar = wx.Gauge(self.statusbar, -1, style=wx.GA_HORIZONTAL|wx.GA_SMOOTH)
        sizer = wx.BoxSizer(wx.HORIZONTAL)
        sizer.Add(self.text1, 0, wx.ALL, 5)
        sizer.Add(self.text2, 1, wx.ALL, 5)
        sizer.Add(self.progress_bar, 2, wx.ALL, 5)
        self.statusbar.SetSizer(sizer)
        self.Show()
        self.progress_bar.SetRange(50)
        self.progress_bar.SetValue(0)

    def OnStart(self,event):
        self.text1.SetLabelText("Started")
        self.count = 0
        self.proc = subprocess.Popen(['ping','127.0.0.1','-i','0.2'],stdin=subprocess.PIPE, stdout=subprocess.PIPE,stderr=subprocess.PIPE)
        while True:
            try:
                list_data = self.proc.stdout.readline()
            except:
                break
            if len(list_data) == 0:
                break
            self.progress_bar.Pulse()
            self.count+=1
            self.text2.SetLabelText("Count "+str(self.count))
            wx.Yield()

    def OnStop(self,event):
        self.text1.SetLabelText("Stopped")
        try:
            self.proc.kill()
        except:
            pass

    def OnExit(self,event):
        try:
            self.proc.kill()
        except:
            pass
        self.Destroy()

if __name__ == '__main__':
    app = wx.App()
    frame = MainFrame()
    app.MainLoop()
正如您所看到的,
状态栏
内置了一个大小调整器,可用于项目的定位和相对大小调整。
我添加了一个
Start
按钮,现在
Stop
不会终止程序


下面是一个简单状态栏的示例,其中包含一个进度条,以调用
ping
的子流程为例进行交互。
希望你能从中获得一些好处

import wx
import subprocess
class MainFrame(wx.Frame):

    def __init__(self):
        wx.Frame.__init__(self, None, title='Statusbar progress')
        panel = wx.Panel(self)
        start_btn = wx.Button(panel, label='Start')
        start_btn.Bind(wx.EVT_BUTTON, self.OnStart)
        stop_btn = wx.Button(panel, label='Stop')
        stop_btn.Bind(wx.EVT_BUTTON, self.OnStop)
        self.Bind(wx.EVT_CLOSE, self.OnExit)
        btn_sizer = wx.BoxSizer(wx.HORIZONTAL)
        btn_sizer.Add(start_btn)
        btn_sizer.Add(stop_btn)
        panel.SetSizer(btn_sizer)
        self.statusbar = self.CreateStatusBar(3)
        self.text1 = wx.StaticText(self.statusbar,-1,("Static text"))
        self.text2 = wx.StaticText(self.statusbar,-1,("Count Text"))
        self.progress_bar = wx.Gauge(self.statusbar, -1, style=wx.GA_HORIZONTAL|wx.GA_SMOOTH)
        sizer = wx.BoxSizer(wx.HORIZONTAL)
        sizer.Add(self.text1, 0, wx.ALL, 5)
        sizer.Add(self.text2, 1, wx.ALL, 5)
        sizer.Add(self.progress_bar, 2, wx.ALL, 5)
        self.statusbar.SetSizer(sizer)
        self.Show()
        self.progress_bar.SetRange(50)
        self.progress_bar.SetValue(0)

    def OnStart(self,event):
        self.text1.SetLabelText("Started")
        self.count = 0
        self.proc = subprocess.Popen(['ping','127.0.0.1','-i','0.2'],stdin=subprocess.PIPE, stdout=subprocess.PIPE,stderr=subprocess.PIPE)
        while True:
            try:
                list_data = self.proc.stdout.readline()
            except:
                break
            if len(list_data) == 0:
                break
            self.progress_bar.Pulse()
            self.count+=1
            self.text2.SetLabelText("Count "+str(self.count))
            wx.Yield()

    def OnStop(self,event):
        self.text1.SetLabelText("Stopped")
        try:
            self.proc.kill()
        except:
            pass

    def OnExit(self,event):
        try:
            self.proc.kill()
        except:
            pass
        self.Destroy()

if __name__ == '__main__':
    app = wx.App()
    frame = MainFrame()
    app.MainLoop()
正如您所看到的,
状态栏
内置了一个大小调整器,可用于项目的定位和相对大小调整。
我添加了一个
Start
按钮,现在
Stop
不会终止程序


使用Destroy()时出现另一个错误。这里是:提高PyDeadObjectError(Self.AtExtR%Surviv.NoNy)PyDaseObjeCaseAd惊恐:已经删除了规范对象的C++部分,不再允许属性访问。如何克服此错误?不要将字符串存储为Gauge类的属性。在销毁仪表之前,将其作为父级的属性或获取它。当我使用destroy()时,出现了另一个错误。这里是:提高PyDeadObjectError(Self.AtExtR%Surviv.NoNy)PyDaseObjeCaseAd惊恐:已经删除了规范对象的C++部分,不再允许属性访问。如何克服此错误?不要将字符串存储为Gauge类的属性。将其作为父级属性,或在销毁仪表之前获取它。感谢您分享一个示例。因为我不想关闭窗口,所以当我删除self.Destroy()时,进度条仍像一个选框样式的进度条一样移动。我想让这个过程一结束就停止。有什么我可以做到的吗?谢谢你分享一个例子。因为我不想关闭窗口,所以当我删除self.Destroy()时,进度条仍像一个选框样式的进度条一样移动。我想让这个过程一结束就停止。我有没有办法做到这一点?