2017-07-31 12 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()を実行しようとしましたが、動作しませんでした。それでは、パルス機能をstdoutの読み込みを停止したときに停止させるにはどうすればいいですか?

答えて

0

私の推測では、プロセスは終了していないと思います。 lineが空であるかどうかを確認するチェックを追加して、そこからループを抜けてください。その後、ゲージにDestroy()と電話することができます。

wxPythonには、あなたが言及したウィジェットに加えてwx.GaugePyGaugeもあります。それらのうちの1つを試してみてください。

+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

編集した回答を表示 –

関連する問題