如何停止Pulse()函数(Python 2.7、wxPython、EnhancedStatusBar)?

2024-06-28 11:35:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试为wxpythongui实现一个进度条。我使用了EnhancedStatusBar(http://xoomer.virgilio.it/infinity77/main/EnhancedStatusBar.html)。我的代码如下所示:

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

我试过了自测规1.Destroy()就在for循环的外部,但它不起作用。那么当脉冲函数停止读取标准输出时,如何使它停止工作呢


Tags: to进度条selfhttpformainhtmlstdout
2条回答

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

请注意,除了您提到的小部件之外,wxPython还有wx.Gauge和{}。你也可以试试。在

下面是一个简单的状态栏示例,其中有一个进度条,它与调用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()

如您所见,statusbar是用一个sizer构建的,它允许对项目进行定位和相对大小调整。
我添加了一个Start按钮,现在Stop不会终止程序

enter image description here

相关问题 更多 >