#! /usr/bin/env python #-*- encoding:UTF-8 -*- ########################## #1.正向计时\逆计时\时钟 #2.使用sizer管理布局 ########################## import wx import time import wx.gizmos as gizmos ICON_START = '|>' ICON_SUSPEND = '||' ICON_RESTART = '<|' TIMETOCOUNT = 40*60 class ClockWindow(wx.Window): """LED CLOCK""" def __init__(self, parent=None, id=-1): wx.Window.__init__(self, parent, id, size=(258,92)) #wx.Window.__init__(self, parent, id, size=sz) self.parent = parent self.Bind(wx.EVT_PAINT, self.OnPaint) self.timer = wx.Timer(self)#创建定时器 self.Bind(wx.EVT_TIMER, self.OnTimer, self.timer)#绑定一个定时器事件 self.timeToCount = 0#累计秒数 w,h = self.GetClientSize() #print w,h self.led = gizmos.LEDNumberCtrl(self, -1, wx.DefaultPosition, (w-10,h-30), gizmos.LED_ALIGN_CENTER) self.led.SetBackgroundColour("black") self.led.SetForegroundColour("red") #开始按钮 self.startButton = wx.Button(self, id, label=ICON_START) self.startButton.SetToolTip(wx.ToolTip('Start')) self.Bind(wx.EVT_BUTTON, self.OnStart, self.startButton) #暂停按钮 self.suspendButton = wx.Button(self, id, label=ICON_SUSPEND) self.suspendButton.SetToolTip(wx.ToolTip('Suspend')) self.Bind(wx.EVT_BUTTON, self.OnStop, self.suspendButton) #重新开始按钮 self.restartButton = wx.Button(self, id, label=ICON_RESTART) self.restartButton.SetToolTip(wx.ToolTip('Restart')) self.Bind(wx.EVT_BUTTON, self.OnRestart, self.restartButton) self.timeRadio = wx.RadioButton(self, -1, "时钟".decode('UTF-8'), style=wx.RB_GROUP) self.Bind(wx.EVT_RADIOBUTTON, self.OnRadio, self.timeRadio) self.timerRadio = wx.RadioButton(self, -1, "正计时".decode('UTF-8')) self.Bind(wx.EVT_RADIOBUTTON, self.OnRadio, self.timerRadio) self.timer_rRadio = wx.RadioButton(self, -1, "倒计时".decode('UTF-8')) self.Bind(wx.EVT_RADIOBUTTON, self.OnRadio, self.timer_rRadio) #sizer sizer = wx.GridBagSizer(hgap = 10, vgap = 10) sizer.Add(self.led, pos=(0, 0), span=(1,3), flag=wx.EXPAND) sizer.Add(self.startButton, pos=(1, 0), flag = wx.EXPAND) sizer.Add(self.suspendButton, pos=(1, 1), flag = wx.EXPAND) sizer.Add(self.restartButton, pos=(1, 2), flag = wx.EXPAND) sizer.Add(self.timeRadio, pos=(2,0), flag=wx.ALIGN_CENTER) sizer.Add(self.timerRadio, pos=(2,1), flag=wx.ALIGN_CENTER) sizer.Add(self.timer_rRadio, pos=(2,2), flag=wx.ALIGN_CENTER) self.SetSizer(sizer) self.Fit() self.IsSuspend = False def OnTimer(self, evt):#显示时间事件处理函数 st = "00 00 00" if self.timeRadio.GetValue():#显示时间 st = time.strftime('%H %M %S', time.localtime()) elif self.timerRadio.GetValue():#正向计时 self.timeToCount += 1 second = self.timeToCount h = second / 3600 m = second / 60 s = second % 60 st = "%02d %02d %02d" %(h, m, s) else:#逆向计时 self.timeToCount -= 1 second = self.timeToCount if second <= 0: self.timer.Stop() dlg = wx.MessageDialog(None, "休息5分钟!".decode('UTF-8'), "Message", wx.OK|wx.ICON_INFORMATION) retCode = dlg.ShowModal() h = second / 3600 m = second / 60 s = second % 60 st = "%02d %02d %02d" %(h, m, s) self.led.SetValue(st) def OnPaint(self, evt): st = "%02d %02d %02d" %(0, 0, 0) self.led.SetValue(st) self.Fit() def OnStart(self, evt): if self.timeRadio.GetValue():#显示时间 self.startButton.Disable() self.suspendButton.Disable() self.restartButton.Disable() elif self.timerRadio.GetValue():#正向计时 if self.IsSuspend: self.suspendButton.Enable() else: self.timeToCount = 0 self.startButton.Disable() self.restartButton.Enable() self.suspendButton.Enable() else:#逆向计时 if self.IsSuspend: self.suspendButton.Enable() else: self.timeToCount = TIMETOCOUNT self.restartButton.Enable() self.suspendButton.Enable() self.timer.Start(1000) self.IsSuspend = False def OnStop(self, evt):#suspend if not self.IsSuspend: self.startButton.Enable() self.suspendButton.Disable() self.timer.Stop() self.IsSuspend = True def OnRestart(self, evt): if self.timerRadio.GetValue():#正向计时 if self.IsSuspend: self.suspendButton.Enable() else: self.timeToCount = 0 self.startButton.Disable() self.restartButton.Enable() self.suspendButton.Enable() else:#逆向计时 self.startButton.Disable() self.suspendButton.Enable() self.timeToCount = TIMETOCOUNT self.timer.Start(1000) self.IsSuspend = False def OnRadio(self, evt): self.timer.Stop() self.led.SetValue("00 00 00") self.startButton.Enable() self.suspendButton.Disable() self.restartButton.Disable() self.IsSuspend = False class ClockFrame(wx.Frame): def __init__(self, parent =None, id=-1): wx.Frame.__init__(self, parent, id, "LED v0.5", size=(300, 170)) self.SetMaxSize((300, 170)) self.SetMinSize((300, 170)) clockWindow = ClockWindow(self, id) if __name__ == '__main__': app = wx.PySimpleApp() frame = ClockFrame() frame.Show() app.MainLoop()