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_())  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM