2017-07-31 38 views
1

我想實現一個wxPython GUI的進度條。我使用了EnhancedStatusBar(http://xoomer.virgilio.it/infinity77/main/EnhancedStatusBar.html)。我的代碼看起來如下:如何停止Pulse()函數(Python 2.7,wxPython,EnhancedStatusBar)?

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(),但它沒有奏效。那麼,如何讓脈衝功能停止,當它停止讀取標準輸出

回答

0

我的猜測是你的過程沒有結束。你應該添加一個檢查,看看line是否爲空,並跳出那裏的循環。然後你可以撥打Destroy()

請注意,除了您提到的窗口小部件之外,wxPython還有wx.GaugePyGauge。你可能也想嘗試其中的一種。

+0

另一個錯誤出現了()。這裏是:raise PyDeadObjectError(self.attrStr%self._name) PyDeadObjectError:Gauge對象的C++部分已被刪除,不再允許屬性訪問。我如何克服這個錯誤? –

+0

不要將字符串存儲爲Gauge類的屬性。在破壞儀表之前,將其作爲父母的屬性或抓住它。 –

0

下面是一個帶有進度條的簡單狀態欄的例子,它與一個以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是建立與分級機,它允許對項目的定位和相對大小。
我添加了一個Start按鈕,現在當我用摧毀Stop不會終止程序

enter image description here

+0

謝謝你分享一個例子。因爲我不想關閉窗口,所以當我刪除self.Destroy()時,進度條仍然像一個選取框樣式進度條一樣移動。我想在流程結束後立即停止。無論如何,我可以做到這一點? –

+0

看到我編輯的答案 –