python GUI开发之计时器

python GUI开发之计时器


1. 前言

pyqt5框架练手,实现一个计时器GUI。

2. 需求分析

实现计时器窗口。

功能需求:

  1. 可以倒计时也可以正计时;
  2. 以win平台可执行文件形式发布。

界面需求:

  1. 简洁美观;
  2. 计时器界面大小可调;

3. 详细设计

开发语言:python
框架:pyqt5,qtdesigner

3.1. 界面设计

界面样式:

3.2. singals/slot

singals/slot列表。

4. 开发过程

  1. qtdesigner设计界面;
  2. 建立信号及槽之间的联系;
  3. 保存文件为xxx.ui;
  4. pyuic生成xxx.py文件,即为主窗口界面文件;
  5. 新建time_clock.py做逻辑处理;
  6. 根据各项菜单,按钮的对应功能/槽函数逐一实现方法代码;
  7. 运行/调试。

5. 使用说明

5.1. 菜单

File:

  • start:同功能按钮“开始/暂停”;
  • reset:同功能按钮“重置”;
  • quit:退出。

Help:

  • About:程序说明。

5.2. 功能按钮

开始/暂停按钮:开始计时,如果spinbox值为0则正向计时;如果给定值大于0则倒计时;
开始计时后可暂停;暂停后可继续计时。

重置:计时器状态重置。

6. 主要代码

6.1. 逻辑处理代码

time_clock.py

  
#!/usr/bin/env python  
#coding:utf-8  

"""  
----------------------------------------  
description:  

author: sss  

date:  
----------------------------------------  
change:  

----------------------------------------  

"""  
__author__ = 'sss'  


import sys  
from functools import partial  
from PyQt5 import QtCore, QtGui, QtWidgets  
from PyQt5.QtWidgets import *  
from PyQt5.QtCore import *  
from PyQt5.QtGui import *  

from timer_clock import *  

class TimerClock(QMainWindow, Ui_MainWindow):  
    def __init__(self, parent=None):  
        super(TimerClock, self).__init__()  
        self.setupUi(self)  

        self.statusBar().showMessage("Ready")  

        # status_running表示是否在计时状态中  
        # 0 初始态; 1 运行态; 2 暂停态  
        self.status_running = 0  
        self.counter = QTime()  
        self.timer = QTimer()  
        # 固定QTimer的轮询参数,指定轮询间隔为5ms  
        self.timer_start = partial(self.timer.start, 5)  
        self.elasped_time = 0  
        self.target_time = None  

        self.timer.timeout.connect(self.timer_timeout)  

    # 开始/暂停按钮功能实现  
    def click_start_button(self):  
        if self.status_running == 0:  
            self.target_time = int(self.spinBox.text()) * 60  
            self.target_time = None if self.target_time == 0 else self.target_time  
            self.status_running = 1  
            self.pushButton.setText("暂停")  
            self.counter.restart()  
            self.timer_start()  # 开始计时  
        elif self.status_running == 1:  
            self.status_running = 2  
            self.pushButton.setText("继续")  
            self.elasped_time = self.elasped_time + self.counter.elapsed() // 1000  
            if self.target_time is not None:  
                self.target_time -= self.counter.elapsed() // 1000  

            self.timer.stop()  
        else:  
            self.status_running = 1  
            self.pushButton.setText("暂停")  
            self.counter.start()  
            self.timer_start()  # 开始计时  

    # 重置按钮功能实现  
    def click_reset_button(self):  
        # 停止循环和计时  
        self.timer.stop()  
        #self.counter.restart()  

        # 参数重置,组件状态重置  
        self.status_running = 0  
        self.target_time = None  
        self.elasped_time = 0  
        self.pushButton.setText("开始")  
        self.lineEdit.setText("00:{:02}:00".format(int(self.spinBox.text())))  

    # 计时器轮询  
    def timer_timeout(self):  
        t_secs = self.counter.elapsed()//1000  
        if self.target_time is not None:  
            t_secs = self.target_time - t_secs  
        else:  
            t_secs += self.elasped_time  

        # 计时结束  
        if t_secs < 0:  
            msBox = QMessageBox(QMessageBox.NoIcon, "提示", "计时结束!")  
            msBox.exec_()  
            self.timer.stop()  
            self.pushButton.setText("开始")  

        t_str = "{:02}:{:02}:{:02}".format((t_secs//60)//60,(t_secs//60)%60, (t_secs)%60)  
        self.lineEdit.setText(t_str)  

    # spinbox值改变  
    def spinBox_valuechanged(self, value):  
        self.lineEdit.setText("00:{:02}:00".format(int(self.spinBox.text())))  

    def show_help_message(self):  
        msBox = QMessageBox(QMessageBox.NoIcon, "关于", "计时器\r\n Version:0.1\r\n 作者:SSS")  
        msBox.exec_()  


if __name__ == '__main__':  
    app = QtWidgets.QApplication(sys.argv)  
    ui = TimerClock()  
    ui.show()  
    sys.exit(app.exec_())  

posted @ 2020-04-14 13:07  木林森__𣛧  阅读(2079)  评论(0编辑  收藏  举报