2010-05-18 5 views
0

Quelqu'un pourrait-il me dire comment implémenter une barre de progression de style dans wxPython? Comme indiqué sur MSDN:barre de progression de style Marquee dans wxPython

vous pouvez l'animer d'une manière qui montre une activité mais ne précise pas ce que proportion de la tâche est terminée.

Merci.

alt text http://i.msdn.microsoft.com/dynimg/IC100842.png

J'ai essayé, mais il ne semble pas fonctionner. La minuterie est activée mais la jauge ne défile pas. De l'aide?

import wx 
import time 

class MyForm(wx.Frame): 

    def __init__(self): 
     wx.Frame.__init__(self, None, wx.ID_ANY, "Timer Tutorial 1", 
            size=(500,500)) 

     # Add a panel so it looks the correct on all platforms 
     panel = wx.Panel(self, wx.ID_ANY) 

     self.timer = wx.Timer(self) 
     self.Bind(wx.EVT_TIMER, self.update, self.timer) 
     self.gauProgress = wx.Gauge(panel, range=1000, pos=(30, 50), size=(440, 20)) 
     self.toggleBtn = wx.Button(panel, wx.ID_ANY, "Start") 
     self.toggleBtn.Bind(wx.EVT_BUTTON, self.onToggle) 

    def onToggle(self, event): 
     btnLabel = self.toggleBtn.GetLabel() 
     if btnLabel == "Start": 
      print "starting timer..." 
      self.timer.Start(1000) 
      self.toggleBtn.SetLabel("Stop") 
     else: 
      print "timer stopped!" 
      self.timer.Stop() 
      self.toggleBtn.SetLabel("Start") 

    def update(self, event): 
     print "\nupdated: ", 
     print time.ctime() 
     self.gauProgress.Pulse() 

# Run the program 
if __name__ == "__main__": 
    app = wx.PySimpleApp() 
    frame = MyForm().Show() 
    app.MainLoop() 
+0

Est-ce que cette vue, ou XP avec la disposition Vista? Je connais un moteur de mise en page pour XP où l'affichage du pouls de wxGauge ne fonctionne pas. Le code que vous avez posté fonctionne sur Vista. – Rudi

+0

Cela a fonctionné sur XP avec la disposition normale mais pas sur Windows 7. Je devine que cela ne fonctionnerait pas sur Windows Vista aussi bien. Aucun moyen de réparer cela? –

+0

Semble que cela a déjà été signalé comme un bug sur le système de suivi des problèmes wxPython. http://trac.wxwidgets.org/ticket/11357 –

Répondre

1

wxGauge a une fonction Pulse()

gauge.Pulse() 
+0

Juste quand j'ai pensé que je l'avais résolu, j'ai rencontré plus de problèmes. Rudi, pourriez-vous me montrer un exemple sur la façon d'utiliser la fonction Pulse. J'ai essayé Google et le wxWiki mais en vain. Merci. –

1

Voici un exemple:

def loadBallots(self): 
    self.dirtyBallots = Ballots() 
    self.dirtyBallots.exceptionQueue = Queue(1) 
    loadThread = Thread(target=self.dirtyBallots.loadUnknown, args=(self.filename,)) 
    loadThread.start() 

    # Display a progress dialog 
    dlg = wx.ProgressDialog(\ 
     "Loading ballots", 
     "Loading ballots from %s\nNumber of ballots: %d" % 
     (os.path.basename(self.filename), self.dirtyBallots.numBallots), 
     parent=self.frame, style = wx.PD_APP_MODAL | wx.PD_ELAPSED_TIME 
    ) 
    while loadThread.isAlive(): 
     sleep(0.1) 
     dlg.Pulse("Loading ballots from %s\nNumber of ballots: %d" % 
       (os.path.basename(self.filename), self.dirtyBallots.numBallots)) 
    dlg.Destroy() 

    if not self.dirtyBallots.exceptionQueue.empty(): 
     raise RuntimeError(self.dirtyBallots.exceptionQueue.get()) 

Ceci est de here.

0

Que diriez-vous de quelque chose comme ceci?

class ProgressDialog(wx.Dialog): 

    def __init__(self, parent, title, to_add=1): 
     """Defines a gauge and a timer which updates the gauge.""" 
     wx.Dialog.__init__(self, parent, title=title, style=wx.CAPTION) 
     self.count = 0 
     self.to_add = to_add 
     self.timer = wx.Timer(self) 
     self.gauge = wx.Gauge(self, range=100, size=(180, 30)) 

     sizer = wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(self.gauge, 0, wx.ALL, 10) 
     self.SetSizer(sizer) 
     sizer.Fit(self) 
     self.SetFocus() 

     self.Bind(wx.EVT_TIMER, self.on_timer, self.timer) 
     self.timer.Start(30) # or however often you want 


    def on_timer(self, event): 
     """Increases the gauge's progress.""" 
     self.count += self.to_add 
     if self.count > 100: 
      self.count = 0 
     self.gauge.SetValue(self.count) 
+0

... c'est une façon de le faire. J'ai déjà utilisé cette méthode auparavant. J'ai juste pensé qu'il serait peut-être préférable d'utiliser quelque chose spécialement conçu pour montrer le progrès d'un processus indéfini. –