My code is below. The main focus would be on the OnStart method. I want
to make sure that a positive integer is entered in the input box. At
first I tried an if/else clause, then switched to try/except. Neither is
perfect yet, but I was wondering which I should try for in the first
place. I figure I need to check for an emptry string, non-numeric
strings (maybe these are the same check), 0 and negative numbers (which
might also fall into the category of 'anything but a number' because of
the negative sign).
Thanks.
-------------------------------
import wx
class MyTimer(wx.Fram e):
def __init__(self):
wx.Frame.__init __(self, None, wx.ID_ANY, 'Timer',
style=wx.DEFAUL T_FRAME_STYLE ^
wx.RESIZE_BORDE R ^ wx.MAXIMIZE_BOX )
panel = wx.Panel(self)
mainSizer = wx.BoxSizer(wx. VERTICAL)
inputSizer = wx.BoxSizer(wx. HORIZONTAL)
self.progress = wx.Gauge(panel, wx.ID_ANY, 100, size=(300, 20))
self.status = wx.StaticText(p anel, wx.ID_ANY, 'Enter a time.')
prompt = wx.StaticText(p anel, wx.ID_ANY, 'Time to wait:')
self.input = wx.TextCtrl(pan el, wx.ID_ANY, size=(20, 20))
self.start = wx.Button(panel , wx.ID_ANY, 'Start')
self.reset = wx.Button(panel , wx.ID_ANY, 'Reset')
self.reset.Disa ble()
self.timer = wx.Timer(self)
mainSizer.Add(s elf.progress, flag=wx.ALIGN_C ENTER | wx.ALL ^
wx.BOTTOM,
border=10)
mainSizer.Add(s elf.status, flag=wx.ALIGN_C ENTER | wx.ALL,
border=10)
mainSizer.Add(i nputSizer, flag=wx.ALIGN_C ENTER | wx.BOTTOM,
border=10)
inputSizer.Add( prompt, flag=wx.ALIGN_C ENTER)
inputSizer.Add( self.input, flag=wx.ALIGN_C ENTER | wx.LEFT |
wx.RIGHT,
border=5)
inputSizer.Add( self.start, flag=wx.ALIGN_C ENTER)
inputSizer.Add( self.reset, flag=wx.ALIGN_C ENTER)
self.Bind(wx.EV T_TEXT_ENTER, self.OnStart, self.input)
self.Bind(wx.EV T_BUTTON, self.OnStart, self.start)
self.Bind(wx.EV T_TIMER, self.OnTimer, self.timer)
self.Bind(wx.EV T_BUTTON, self.OnReset, self.reset)
panel.SetSizer( mainSizer)
mainSizer.Fit(s elf)
def OnStart(self, event):
try:
self.time = int(self.input. GetValue())
self.minutes_pa ssed = 1
self.minutes_re maining = self.time - 1
self.start.Disa ble()
self.input.Disa ble()
self.reset.Enab le()
self.status.Set Label('%s minute(s) remaining.' % self.time)
self.timer.Star t(1000)
except ValueError:
wx.MessageBox(' Enter a valid time.', 'Invalid time entered',
wx.OK | wx.ICON_ERROR)
self.input.Clea r()
def OnReset(self, event):
if self.timer.IsRu nning():
self.timer.Stop ()
self.input.Clea r()
self.input.Enab le()
self.start.Enab le()
self.reset.Disa ble()
self.status.Set Label('Enter a new time.')
self.progress.S etValue(0)
self.minutes_pa ssed = 1
def OnTimer(self, event):
if self.minutes_re maining != 0:
self.progress.S etValue(self.mi nutes_passed * (100.0 /
self.time))
self.status.Set Label('%s minute(s) remaining.' %
self.minutes_re maining)
self.minutes_pa ssed += 1
self.minutes_re maining -= 1
else:
self.timer.Stop ()
self.progress.S etValue(self.mi nutes_passed * (100.0 /
self.time))
self.status.Set Label('%s minute(s) have elapsed.' % self.time)
wx.Sound.Play(w x.Sound(r'C:\Wi ndows\Media\not ify.wav'))
class MyApp(wx.App):
def OnInit(self):
frame = MyTimer()
self.SetTopWind ow(frame)
frame.Show()
return True
if __name__ == '__main__':
app = MyApp(False)
app.MainLoop()
to make sure that a positive integer is entered in the input box. At
first I tried an if/else clause, then switched to try/except. Neither is
perfect yet, but I was wondering which I should try for in the first
place. I figure I need to check for an emptry string, non-numeric
strings (maybe these are the same check), 0 and negative numbers (which
might also fall into the category of 'anything but a number' because of
the negative sign).
Thanks.
-------------------------------
import wx
class MyTimer(wx.Fram e):
def __init__(self):
wx.Frame.__init __(self, None, wx.ID_ANY, 'Timer',
style=wx.DEFAUL T_FRAME_STYLE ^
wx.RESIZE_BORDE R ^ wx.MAXIMIZE_BOX )
panel = wx.Panel(self)
mainSizer = wx.BoxSizer(wx. VERTICAL)
inputSizer = wx.BoxSizer(wx. HORIZONTAL)
self.progress = wx.Gauge(panel, wx.ID_ANY, 100, size=(300, 20))
self.status = wx.StaticText(p anel, wx.ID_ANY, 'Enter a time.')
prompt = wx.StaticText(p anel, wx.ID_ANY, 'Time to wait:')
self.input = wx.TextCtrl(pan el, wx.ID_ANY, size=(20, 20))
self.start = wx.Button(panel , wx.ID_ANY, 'Start')
self.reset = wx.Button(panel , wx.ID_ANY, 'Reset')
self.reset.Disa ble()
self.timer = wx.Timer(self)
mainSizer.Add(s elf.progress, flag=wx.ALIGN_C ENTER | wx.ALL ^
wx.BOTTOM,
border=10)
mainSizer.Add(s elf.status, flag=wx.ALIGN_C ENTER | wx.ALL,
border=10)
mainSizer.Add(i nputSizer, flag=wx.ALIGN_C ENTER | wx.BOTTOM,
border=10)
inputSizer.Add( prompt, flag=wx.ALIGN_C ENTER)
inputSizer.Add( self.input, flag=wx.ALIGN_C ENTER | wx.LEFT |
wx.RIGHT,
border=5)
inputSizer.Add( self.start, flag=wx.ALIGN_C ENTER)
inputSizer.Add( self.reset, flag=wx.ALIGN_C ENTER)
self.Bind(wx.EV T_TEXT_ENTER, self.OnStart, self.input)
self.Bind(wx.EV T_BUTTON, self.OnStart, self.start)
self.Bind(wx.EV T_TIMER, self.OnTimer, self.timer)
self.Bind(wx.EV T_BUTTON, self.OnReset, self.reset)
panel.SetSizer( mainSizer)
mainSizer.Fit(s elf)
def OnStart(self, event):
try:
self.time = int(self.input. GetValue())
self.minutes_pa ssed = 1
self.minutes_re maining = self.time - 1
self.start.Disa ble()
self.input.Disa ble()
self.reset.Enab le()
self.status.Set Label('%s minute(s) remaining.' % self.time)
self.timer.Star t(1000)
except ValueError:
wx.MessageBox(' Enter a valid time.', 'Invalid time entered',
wx.OK | wx.ICON_ERROR)
self.input.Clea r()
def OnReset(self, event):
if self.timer.IsRu nning():
self.timer.Stop ()
self.input.Clea r()
self.input.Enab le()
self.start.Enab le()
self.reset.Disa ble()
self.status.Set Label('Enter a new time.')
self.progress.S etValue(0)
self.minutes_pa ssed = 1
def OnTimer(self, event):
if self.minutes_re maining != 0:
self.progress.S etValue(self.mi nutes_passed * (100.0 /
self.time))
self.status.Set Label('%s minute(s) remaining.' %
self.minutes_re maining)
self.minutes_pa ssed += 1
self.minutes_re maining -= 1
else:
self.timer.Stop ()
self.progress.S etValue(self.mi nutes_passed * (100.0 /
self.time))
self.status.Set Label('%s minute(s) have elapsed.' % self.time)
wx.Sound.Play(w x.Sound(r'C:\Wi ndows\Media\not ify.wav'))
class MyApp(wx.App):
def OnInit(self):
frame = MyTimer()
self.SetTopWind ow(frame)
frame.Show()
return True
if __name__ == '__main__':
app = MyApp(False)
app.MainLoop()
Comment