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
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? –
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. –