Skip to content

[PyQt5] 基本教學(8) QTimer, QlcdNumber

Last Updated on 2021-04-11 by Clay

最近在寫的界面常常陷入卡死的狀態,總感覺這次真的需要 Thread 的加持了。不過在我練習 QThread 的過程中,我驚訝地發現一件事情。

網路上的教程說使用 LCD 來顯示計時會有點卡頓、需要使用 QThread 才能正常運作。

奇怪,我的電腦好像,有點好。完全感覺不出界面有死掉的跡象啊!超順的。不過再次認真研究了下 QTimer,啊,原來不是我電腦好,而是使用 QTimer 的時候本來就會另外開 Thread。

太失望了,還以為我的筆電終於可以揚眉吐氣。

最近應該筆記應該會進展到該如何使用 QThread,其實我之前有用在我的專案上,但感覺效能並沒有提昇多少,我猜我的問題根本是同時使用太多工具導致 Memory 爆掉,跟多執行緒一點關係都沒有。

那麼,今天就來筆記一下該如何使用 QTimer 以及 QlcdNumber 吧!紀錄了這兩種工具,接下來應該就可以比較好的測試 QThread 了。


QTimer

顧名思義,QTimer 就是 PyQt5 裡頭提供的一種計時器,可以方便我們計時。

首先我們來看著簡單的範例程式,今天我就暫時不貼我使用 PyUIC 自動產生的界面檔了,大家可以自己隨意佈置自己的布局。

我拉的界面長這樣:

分別有著一個 LCD 面板、兩個按鈕。

目前的設計是使用 QTimer 來計時,每過去一秒便讓 LCD 面板顯示加 1。

那麼我們來看看簡單的程式碼:

# -*- coding: utf-8 -*-
from PyQt5 import QtWidgets
from PyQt5.QtCore import QTimer
from thread_test import Ui_MainWindow
import sys


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        # QTimer
        self.timer = QTimer()

        # QPushButton
        self.ui.pushButton.clicked.connect(self.timeGo)
        self.ui.pushButton_2.clicked.connect(self.timeStop)

        # Other
        self.timer.timeout.connect(self.LCDEvent)
        self.s = 0

    def timeGo(self):
        self.timer.start(100)

    def timeStop(self):
        self.timer.stop()

    def LCDEvent(self):
        self.s += 1
        self.ui.lcdNumber.display(self.s)


if __name__ == '__main__':
    app = QtWidgets.QApplication([])
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())


我們可以看到:

def timeGo(self):
    self.timer.start(100)


timeGo() 將我們初始化的 QTimer 開始計時,要注意的是這裡的單位是毫秒,即是一毫秒等於千分之一秒。這裡是我設得快了些,每 0.1 秒計時一次。

self.timer.timeout.connect(self.LCDEvent)


這段程式碼最重要的就是 timeout 這個指令,是讓 timer 計時完之後觸發 LCDEvent() 這個函式,,也就是:

def LCDEvent(self):
    self.s += 1
    self.ui.lcdNumber.display(self.s)


這段程式碼的內容。增加 1 秒、讓 LCD 物件顯示出來。


剩下的 timeStop() 其實沒麼好講的,就是讓我的 timer sleep 而已。
如上,可以看到我們的程式真的開始計時。


QLCDNumber

LCDNumber 顧名思義便是一個 LCD 物件,可以讓我們在圖形化界面上顯示 LCD 面板,上頭可以顯示數字。

如同上方的程式碼,你只需要呼叫 display() 就可以顯示數字了。

有趣的是,這個 LCDNumber 不只可以顯示十進位的數字(也就是預設),它也可以顯示例如二進制、八進制、十六進制 …… 等等的數字。

  • setBinMode(): 顯示二進制
  • setOctMode(): 顯示八進制
  • setDecMode(): 顯示十進制 (預設)
  • setHexMode(): 顯示十六進制

除此之外,這個元件也可以吃字串顯示一些文字,例如:

self.ui.lcdNumber.display('22:10')


Output:


所以,如果我們真的要做一個鬧鐘或看板,用 LCDNumber 是絕對可以辦到的。


Read More

Leave a Reply