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
- [PyQt5] 基本教學(1) 安裝 PyQt5,印出 Hello World!
- [PyQt5] 基本教學(2) QLabel, QLineEdit, QPushButtom
- [PyQt5] 基本教學(3) QMainWindow, QIcon, QPixmap, QPalette
- [PyQt5] 基本教學(4) 菜單、工具欄
- [PyQt5] 基本教學(5) 進度條、滑動條、旋轉鈕
- [PyQt5] 基本教學(6) 下拉選單、BoxLayout
- [PyQt5] 基本教學(7) hide, show, 自動適應窗口大小
- [PyQt5] 基本教學(8) QTimer, QlcdNumber
- [PyQt5] 基本教學(9) QCaledar,使用 Python 輕鬆創造日曆元件
- [PyQt5] 基本教學(10) 使用鍵盤輸入指令、判斷滑鼠點擊位置
- [PyQt5] 基本教學(11) 使用 QColorDialog 調色盤來進行顏色的設定