2017-07-31 4 views
1

J'essaie d'implémenter une barre de progression pour une interface graphique wxPython. J'ai fait usage de la EnhancedStatusBar (http://xoomer.virgilio.it/infinity77/main/EnhancedStatusBar.html). Mon code se présente comme suit:Comment arrêter la fonction 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 

J'ai essayé de faire self.gauge1.Destroy() juste à l'extérieur de la boucle, mais il ne marchait pas. Alors, comment faire pour que la fonction Pulse s'arrête quand elle arrête la lecture stdout

Répondre

0

Je suppose que votre processus ne se termine pas. Vous devriez ajouter une vérification pour voir si line est vide et sortir de la boucle là. Ensuite, vous pouvez appeler Destroy() sur votre jauge.

Notez que wxPython a également wx.Gauge et PyGauge en plus du widget que vous avez mentionné. Vous pourriez vouloir essayer l'un d'entre eux aussi.

+0

Une autre erreur a montré quand je destroy(). Le voici: raise PyDeadObjectError (self.attrStr% self._name) PyDeadObjectError: La partie C++ de l'objet Gauge a été supprimée, l'accès aux attributs n'est plus autorisé. Comment puis-je surmonter cette erreur? –

+0

Ne stockez pas la chaîne en tant qu'attribut de la classe Gauge. Faites-en un attribut du parent ou attrapez-le avant de détruire la jauge. –

0

Voici un exemple de barre d'état simple avec une barre de progression, interagissant avec un sous-processus appelant ping à titre d'exemple.
J'espère que vous en aurez un peu plus.

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() 

Comme vous pouvez le voir le statusbar est construit avec un calibreur qui permet le positionnement et le dimensionnement relatif des éléments.
J'ai ajouté un bouton Start et maintenant Stop ne met pas fin au programme

enter image description here

+0

Merci d'avoir partagé un exemple. Comme je ne veux pas fermer ma fenêtre, quand je supprime self.Destroy(), la barre de progression continue de bouger comme une barre de progression de style. Je veux l'arrêter dès que le processus se termine. Y at-il de toute façon que je pourrais accomplir cela? –

+0

Voir ma traduction modifiée –