這篇我們要來學一個新的東西 QTimer!
QTimer 是獨立於程式運作的計時器,
你可能會想什麼時候會用到?
其實很意外的,真正的程式反而非常經常會需要這個,功能來作為「自動更新」,
我們仔細想想,一般的程式一行接一行執行下去,但萬一有個背景任務,
是隨著時間要定期更新的,我們主程式的流程哪有「突然切換至時間功能,並更新」,這樣的設計
(如果是 step by step 的設計程式,這樣也太難。)
因此我們有 QTimer 的設計,來幫助我們定期更新一些東西,或做一些其他事情。
之後也會介紹 QThread,也同樣的是讓主程式在執行的同時,能夠同時有其他的支線任務可以獨立運行!
我們接下來的討論,會基於讀者已經先讀過我 day5 文章 的架構下去進行程式設計
如果還不清楚我程式設計的邏輯 (UI.py、controller.py、start.py 分別在幹麻)
建議先閱讀 day5 文章後再來閱讀此文。
https://www.wongwonggoods.com/python/pyqt5-5/
https://github.com/howarder3/ironman2021_PyQt5_photoshop/tree/main/day18_qtimer
這次我們的重點不是放在 UI 設計,我們簡單拉一個作為結果顯示用的 Qlabel 即可。
一樣的編譯指令,我們加上 -x (也可不加),
我們就可以先檢視看看轉換後的視窗是不是跟我們想像的一樣。
pyuic5 -x day18.ui -o UI.py
一樣,這程式只有介面 (視覺上的呈現),沒有任何互動功能
python UI.py
QTimer 的使用方式很簡單,主要我們需要設定一個 timeout 時間,
每經過一次 timeout,我們的程式就會做一次指定的事情
from PyQt5 import QtCore
from PyQt5.QtWidgets import QMainWindow, QFileDialog
from PyQt5.QtCore import QTimer
import time
import os
from UI import Ui_MainWindow
class MainWindow_controller(QMainWindow):
def __init__(self):
super().__init__() # in python3, super(Class, self).xxx = super().xxx
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.setup_control()
def setup_control(self):
self.timer=QTimer() # init QTimer
self.timer.timeout.connect(self.run) # when timeout, do run one
self.timer.start(1) # start Timer, here we set '1ms' while timeout one time
self.time_counter = 0 # init time counter # for testing: 3599000
def run(self):
self.ui.label.setText(str(self.set_time_counter_format(self.time_counter))) # show time_counter (by format)
self.time_counter += 1 # time_counter + 1
def set_time_counter_format(self, time_counter):
ms = time_counter % 1000
total_sec = max(0, (time_counter - ms)//1000)
hour = max(0, total_sec//3600)
minute = max(0, total_sec//60 - hour * 60)
sec = max(0, (total_sec - (hour * 3600) - (minute * 60)))
return f"{hour}:{minute:0>2}:{sec:0>2}.{ms:0>3}"
我們先來看一下,最主要的設定 QTimer 部分
照我們 day5 的程式架構,我們執行
python start.py
於是我們就這樣完成了我們的碼表 (stopwatch)。
此外,我們可以透過更改 counter 的初始值來修正程式錯誤
例如依照我們上面的算式,我們可以設定初始值為 "3599000",我們可以同時驗證「小時」、「分鐘」、「秒」、能不能正確增加 (因為從約 0:59:50開始)
★ 本文也同步發於我的個人網站(會有內容目錄與顯示各個小節,閱讀起來更流暢):【PyQt5】Day 18 / Project 使用 QTimer,自製碼表(計時器) PyQt5 stopwatch DIY