wxpython实现LED计时器_第1张图片


#! /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()