LCD倒计时——笔记

最近想写一个类似于自动化模拟考试的东东,其中有一部分是设置倒计时,时间到则停止答题。每个单元分开实现,最后组装在一起就ok 啦,(分开实现,便于调试啦,个人觉得)。花了一个多小时设计和写code,一个多小时debug。嘿嘿。。。

实现平台:Pycharm 3.4.1  python2.7.8  Qt4.8 pyside

王道先行:(声明这只是一个demo,只是实现倒计时器的显示,其余忽略),用的主要控件是QtGui.QLCDNumber

初始界面:

菜单栏:(1)Set CountDown :设置倒计时的时间(1~100)

(2)Start Testing:开始考试,即开始倒计时

(3)Pause Testing:按一下暂停计时,再按一下继续计时,跟音乐播放器的暂停键一样

(4)Stop Testing:中途停止考试,倒计时清0

下面贴代码,就着代码写思路。

from PySide import QtGui,QtCore

ORIGINAL_TIME = 0
class MainWindow(QtGui.QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()

        self.time = ORIGINAL_TIME
        self.timer = None
        self.isPause = False

        self.creatMenuBar()
        self.creatToolBar()
        self.creatActions()
        self.creatCountDown()
        self.resize(300,400)

    def creatMenuBar(self):
        menuBar = self.menuBar()
        self.fileMenu = menuBar.addMenu(‘File‘)
        self.setMenuBar(menuBar)

    def creatToolBar(self):
        pass

    def creatActions(self):
        self.setCountDown = QtGui.QAction(‘Set CountDown‘,self,triggered = self.changeCountDown)
        self.changeBackGround = QtGui.QAction(‘Change BackGround‘,self,triggered = self.setBackGround)
        self.startTesting = QtGui.QAction(‘Start Testing‘,self,triggered = self.startTestSet)
        self.closeTesting = QtGui.QAction(‘Stop Testing‘,self,triggered = self.stopTest)
        self.pauseTesting = QtGui.QAction(‘Pause Testing‘,self,triggered = self.pauseTest)
        self.fileMenu.addAction(self.setCountDown)
        self.fileMenu.addAction(self.changeBackGround)
        self.fileMenu.addAction(self.startTesting)
        self.fileMenu.addAction(self.pauseTesting)
        self.fileMenu.addAction(self.closeTesting)

    def changeCountDown(self):        #创建倒计时控件
         if self.timer is None:
            self.time,ok = QtGui.QInputDialog.getInteger(self,
                "Set CountDown", "Percentage:", 45, 0, 120, 1)    #获取输入的对话框,这里的45,是在对话框中的已设值
            if ok :
                if self.time <= 0 or self.time > 100:
                    QtGui.QMessageBox.warning(self,"Warning Message",‘\nPlease enter a integer i like :0 < i <= 100‘)
                    self.changeCountDown()            #这边有个递归的感觉,如果输入的值不符合要求,则出现提示对话框后,再次出现输入的对话框
                else:
                    self.updateTime()    #设置完初始值后,更新界面上的显示时间
         else:
             QtGui.QMessageBox.warning(self,"Warning Message","\n Please stop the Testing first before you reset the CountDown")            #如果在倒计时的过程中需要重设初始值,则提示“请在重设倒计时前,先停止考试”

    def updateTime(self):
        zero = ‘‘
        zeroDouble = ‘:00‘
        if self.time < 10:
            zero = ‘0‘
        if self.time == 100:
            zeroDouble = ‘:0‘
        self.countDown.display(zero + str(self.time)+zeroDouble)

    def setBackGround(self):
        pass

    def startTestSet(self):      #这是一个开始到倒计时的模块
        if self.timer:
          self.timer.stop()
            zero = ‘‘
            zeroDouble = ‘:00‘
            if self.time < 10:
              zero = ‘0‘
            if self.time == 100:
              zeroDouble = ‘:0‘
            self.countDown.display(zero+ str(self.time) +zeroDouble)
        if self.getNumber():
            self.timer = QtCore.QTimer(self)
            self.timer.timeout.connect(self.timeReset)  #每个一秒钟,改变显示的剩余时间
            self.timer.start(1000)

    def getNumber(self):
        self.minNumber = self.time
        self.secondNumber = 0
        if self.minNumber == 0:
            QtGui.QMessageBox.warning(self,"Warning Message",                                      "\nPlease set CountDown first!")
            return False
        return True

    def timeReset(self):
        self.zeroMin = ‘‘
        self.zeroSecond = ‘‘
        if self.secondNumber == 0:
            self.secondNumber = 59
            if self.minNumber == 0:   #当分钟位和秒钟位同时为0时,表明时间已到,则停止考试,显示提示对话框
                self.stopTest()
                QtGui.QMessageBox.warning(self,"Warning Message",                                          "\n        GAME OVER!\nPlease wait for your record.\t")
                return
            else:
                self.minNumber -= 1
        else:
            self.secondNumber -= 1
        if self.minNumber < 10:
            self.zeroMin = ‘0‘
        if self.secondNumber < 10:
            self.zeroSecond = ‘0‘
        self.countDown.display(self.zeroMin + str(self.minNumber) + ‘:‘ +self.zeroSecond +str(self.secondNumber))

    def stopTest(self):
        try:
            self.timer.stop()
        except:
            pass
        self.countDown.display(‘0‘+str(ORIGINAL_TIME) + ":00")
        self.timer = None
        self.time = 0

    def pauseTest(self):    #这个一个暂停计时的模块
        if self.timer :
            if self.isPause:        #由于第一次按下暂停键为暂停,第二按下暂停键为继续,故需要一个flag:self.isPause,来随时改变状态
                self.isPause = False
            else:
                self.isPause = True
            if self.isPause:
                self.timer.stop()
                self.countDown.display(self.zeroMin + str(self.minNumber) + ‘:‘ +self.zeroSecond +str(self.secondNumber))
            else:
                self.timer = QtCore.QTimer(self)
                self.timer.timeout.connect(self.timeReset)
                self.timer.start(1000)
        else:
            return

    def creatCountDown(self):
        self.countDown = QtGui.QLCDNumber()
        self.countDown.display(‘0‘+str(self.time)+":00")
        self.edit = QtGui.QTextEdit()
        self.label = QtGui.QLabel(‘Count Down‘)
        #self.label.
        self.splitter = QtGui.QSplitter(QtCore.Qt.Vertical)
        splitterH = QtGui.QSplitter()
        splitterH.addWidget(self.label)
        splitterH.addWidget(self.countDown)
        self.splitter.addWidget(splitterH)
        self.splitter.addWidget(self.edit)
        self.setCentralWidget(self.splitter)

if __name__ == ‘__main__‘:
    import sys
    app = QtGui.QApplication(sys.argv)
    mainWindow = MainWindow()
    mainWindow.show()
    sys.exit(app.exec_())

几点注意的地方:

正常的设计案件顺序是:setCountDown——startTesting——(Pause/stop)

但是有些时候肯定会出现乱按键的情况:

(1)还没有设置初始值,就start Testing,所以需要给self.timer在init中赋初值none,并且在start Testing中判断timer是否已经开启,如果没有开启则选获取实现设好的值。如果已开启,则停止timer,并在界面上显示预先设置的初值。重新开始倒计时。

(2)最重要的是在stop 中一定将timer 关掉和将self.time置零。

(3)只要你的timer在运转中,想要重置初值,都会提示:“请先结束考试,再设初值”。

(4)其实,不管键再乱按,只要每个键触犯的函数做好判断就ok啦

不足的地方:

(1)这个LCDNumber模块有个缺点就是只能显示五位,所以去除掉“:”,就只剩下四位,再去掉秒钟位的两位,只能显示的最大值就是99分钟了。。。。

(2)不是很好看呀,哈哈。。还有其他功能上的待发现。

时间: 2024-09-27 06:06:46

LCD倒计时——笔记的相关文章

LCD实验学习笔记(七):NAND FLASH

s3c2440 CPU内置NAND FLASH控制器.相关寄存大器起始地址为0x4e000000. 通过设置NFCONF寄存器,设置NAND FLASH 时序. 通过设置NFCONT寄存器,使能NAND FLASH.初始化ECC等. 代码: #define GSTATUS1 (*(volatile unsigned int *)0x560000B0) //读此寄存器可以知道CPU芯片型号#define BUSY 1 #define NAND_SECTOR_SIZE_LP 2048 //大页每页2

LCD实验学习笔记(八):中断控制器

s3c2440有60个中断源(其中15个为子中断源). 程序状态寄存器(PSR)的F位设为1,禁用快速中断(FRQ). 程序状态寄存器(PSR)的I位设为1,禁用普通中断(IRQ). 相反,PSR寄存器F位为0开FRQ中断,I位为0开IRQ中断. s3c2440中断控制器中有五个控制寄存器:中断源等待寄存器(SRCPND),中断模式寄存器(INTMOD),屏蔽寄存器(INTMSK),优先级寄存器(PRIORITY),中断等待寄存器(INTPND). SRCPND寄存器各位对应不同的中断,其中外部

STM32 FSMC学习笔记+补充(LCD的FSMC配置)

STM32 FSMC学习笔记+补充(LCD的FSMC配置) STM32 FSMC学习笔记 STM32 FSMC的用法--LCD

展讯sc7731 LCD驱动简明笔记之三

此篇笔记基于sc7731 - android 5.1,对lcd的gralloc库做一个简明笔记. 第一部分 调用gralloc.sc8830.so所谓的Gralloc模块,它就是一个模块,一个操作kernel层framebuffer驱动的动态库模块,它属于大名鼎鼎的HAL层.用的时候就加载到内存空间,不用的时候就从内存空间中卸载掉.下面看下系统如何将该模块加载到内存空间的.在Android系统中,所有访问HAL层模块的应用,都需要通过一个叫 hw_get_module() 的方法去获得需要的HA

展讯sc7731 LCD驱动简明笔记之二

此篇笔记基于sc7731 - android 5.1,对lcd的framebuffer做一个简明笔记. 一共分为两大部分:第一部分,关于LCD的硬件方面的:第二部分,关于lcd核心处理(framebuffer)部分的. 第一部分,LCD硬件相关的 一.液晶 液晶是一种高分子有机材料.当给它加上直流电场后,原本有序的分子排列被打乱,一部分液晶变得不透明,颜色加深,便因此显示出字符和图形. 液晶的光电效应:干涉.散射.衍射.旋光.吸收等. 二.LCD种类 1. 构造: 使用两块玻璃板夹着一块液晶:一

I.MX6Q(TQIMX6Q/TQE9)学习笔记——新版BSP之LCD移植

经过前面的移植,eMMC已经可以在tqimx6q上正常运行了,本文将来移植LCD驱动. DTS编写 imx6的LCD控制器与之前的芯片略有不同,详细的信息可以阅读芯片手册.参考sabrelite开发板的DTS,我们可以添加如下内容: / { ... aliases { mxcfb0 = &mxcfb1; }; ... regulators { ... reg_mipi_dsi_pwr_on: mipi_dsi_pwr_on { compatible = "regulator-fixed&

AM335x(TQ335x)学习笔记——LCD驱动移植

TI的LCD控制器驱动是非常完善的,共通的地方已经由驱动封装好了,与按键一样,我们可以通过DTS配置完成LCD的显示.下面,我们来讨论下使用DTS方式配置内核完成LCD驱动的思路. (1)初步分析 由于TQ335x使用的芯片是AM335x,故仍然可以参考am335x-evm.dts.当然,am335x-evmsk.dts.am335x-beagbone.dts都可以.本文以am335x-evm.dts为例.大体上浏览下DTS文件,可以发现两个醒目的节点:一个是panel,一个是backlight

祼机源码学习笔记(一):LCD之Makefile

主Makefile总领全局的就这句—— lcd.bin: $(objs) 要生成lcd.bin,依赖于objs列举的一堆文件:head.o init.o nand.o interrupt.o serial.o lcddrv.o framebuffer.o lcdlib.o main.o lib/libc.a 所以要先找到这些文件,几个.o,还有一个.a .o目标文件怎么生成? %.o:%.c和%.o:%.S是生成规则,就是依赖于.c或.S文件,使用交叉编译命令生成. .a是库文件,到lib子目录

LCD驱动学习笔记

通过这几天的学习发现驱动的框架感觉都差不多,一般分为以下几个步骤: 分配一个结构体 struct x *x = amlloc(); 设置结构体的参数 硬件寄存器 file_operations 注册 卸载 不同之处就是设置这一环节,lcd的驱动的框架就是这么回事,只不过设置的各项参数比较多. lcd的设置项包括 固定参数 可变参数 操作函数 硬件.寄存器 设置显存(framebuffer) 使能lcd