I'd be curious to know if this works any differently on other computers/platforms or while other things are happening in the background. I can't tell if it's the Timer object that isn't keep accurate time (although a test with time.time() seems to show that it is), or if I'm just messing up my algorithm to fill the progress bar. If I put in 10 seconds, the progress bar will be fully filled at the end, but if you put 30, it doesn't. As the number gets higher, the less the bar gets filled when it's done running. (52 seconds only fills half the bar at the end!)
Hopefully someone can look at my logic (mostly in the OnTimer method) and see right away how I'm screwing this up. Thanks. ------------------------- import wx class MyTimer(wx.Frame): def __init__(self): wx.Frame.__init__(self, None, wx.ID_ANY, style=wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER) panel = wx.Panel(self) mainSizer = wx.BoxSizer(wx.VERTICAL) inputSizer = wx.BoxSizer(wx.HORIZONTAL) self.minutesPassed = 1 self.progress = wx.Gauge(panel, wx.ID_ANY, 100, size=(300, 20)) self.status = wx.StaticText(panel, wx.ID_ANY, 'Enter a time.') prompt = wx.StaticText(panel, wx.ID_ANY, 'Time to wait:') self.input = wx.TextCtrl(panel, wx.ID_ANY, '30', size=(20, 20)) self.start = wx.Button(panel, wx.ID_ANY, 'Start') self.reset = wx.Button(panel, wx.ID_ANY, 'Reset') self.reset.Disable() self.timer = wx.Timer(self) mainSizer.Add(self.progress, flag=wx.ALIGN_CENTER | wx.ALL ^ wx.BOTTOM, border=10) mainSizer.Add(self.status, flag=wx.ALIGN_CENTER | wx.ALL, border=10) mainSizer.Add(inputSizer, flag=wx.ALIGN_CENTER | wx.BOTTOM, border=10) inputSizer.Add(prompt, flag=wx.ALIGN_CENTER) inputSizer.Add(self.input, flag=wx.ALIGN_CENTER | wx.LEFT | wx.RIGHT, border=5) inputSizer.Add(self.start, flag=wx.ALIGN_CENTER) inputSizer.Add(self.reset, flag=wx.ALIGN_CENTER) self.Bind(wx.EVT_TEXT_ENTER, self.OnStart, self.input) self.Bind(wx.EVT_BUTTON, self.OnStart, self.start) self.Bind(wx.EVT_TIMER, self.OnTimer, self.timer) self.Bind(wx.EVT_BUTTON, self.OnReset, self.reset) panel.SetSizer(mainSizer) mainSizer.Fit(self) def OnStart(self, event): self.time = int(self.input.GetValue()) self.countdown = self.time - 1 self.start.Disable() self.reset.Enable() self.input.Disable() self.status.SetLabel('%s minutes remaining.' % self.time) self.timer.Start(1000) def OnReset(self, event): self.input.Clear() self.status.SetLabel('Enter a new time.') self.progress.SetValue(0) self.input.Enable() self.minutesPassed = 1 def OnTimer(self, event): if self.countdown != 0: #print self.minutesPassed, self.countdown self.progress.SetValue(self.minutesPassed * (100 / self.time)) self.status.SetLabel('%s minutes remaining.' % self.countdown) self.minutesPassed += 1 self.countdown -= 1 else: self.progress.SetValue(self.minutesPassed * (100 / self.time)) self.status.SetLabel('%s minutes have elapsed.' % self.time) class MyApp(wx.App): def OnInit(self): frame = MyTimer() self.SetTopWindow(frame) frame.Show() return True if __name__ == '__main__': app = MyApp(False) app.MainLoop() -- http://mail.python.org/mailman/listinfo/python-list