python GUI开发之计时器
python GUI开发之计时器
1. 前言
pyqt5框架练手,实现一个计时器GUI。
2. 需求分析
实现计时器窗口。
功能需求:
- 可以倒计时也可以正计时;
- 以win平台可执行文件形式发布。
界面需求:
- 简洁美观;
- 计时器界面大小可调;
3. 详细设计
开发语言:python
框架:pyqt5,qtdesigner
3.1. 界面设计
界面样式:

3.2. singals/slot
singals/slot列表。

4. 开发过程
- qtdesigner设计界面;
- 建立信号及槽之间的联系;
- 保存文件为xxx.ui;
- pyuic生成xxx.py文件,即为主窗口界面文件;
- 新建time_clock.py做逻辑处理;
- 根据各项菜单,按钮的对应功能/槽函数逐一实现方法代码;
- 运行/调试。
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_())
日拱一卒无有尽,功不唐捐终入海

浙公网安备 33010602011771号