QTimer 定時器
QTimer 是 PyQt6 裡的處理時間的一個非常重要的方法,由於透過 PyQt6 產生視窗介面時,所有功能等同被封裝在一個「迴圈」裡,如果需要在迴圈中處理「定時執行某件事」,就需要使用 QTimer 定時器的功能,這篇教學會介紹如何在 PyQt6 視窗裡使用 QTimer 定時器,並透過定時器做出一些簡單的應用。
快速導覽:
因為 Google Colab 不支援 PyQt6,所以請使用本機環境 ( 參考:使用 Python 虛擬環境 ) 或使用 Anaconda Jupyter 進行實作 ( 參考:使用 Anaconda )。
使用 QTimer 定時器
載入 QtCore 模組,就能開始使用 QTimer 方法,基本的操作流程如下:
- 使用
QtCore.QTimer()
加入定時器。- 使用
timeout.connect(fn)
設定定時要啟用的 function。- 使用
start(ms)
啟用定時器,設定間隔毫秒數。- 使用
stop()
停止定時器。
以下方的程式碼為例,程式執行後,畫面中會以每格 0.5 秒 ( 500 毫秒 ) 的間隔,將數字不斷往上累加。
from PyQt6 import QtWidgets, QtCore
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
Form.setWindowTitle('oxxo.studio')
Form.resize(300, 200)
label = QtWidgets.QLabel(Form) # 加入 QLabel 顯示數字
label.setGeometry(20,10,100,40)
label.setStyleSheet('font-size:30px;')
a = 0
def count():
global a
a = a + 1 # 數字增加 1
label.setText(str(a)) # QLabel 顯示數字
timer = QtCore.QTimer() # 加入定時器
timer.timeout.connect(count) # 設定定時要執行的 function
timer.start(500) # 啟用定時器,設定間隔時間為 500 毫秒
Form.show()
sys.exit(app.exec())
class 寫法:
from PyQt6 import QtWidgets, QtCore
import sys
class MyWidget(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('oxxo.studio')
self.resize(300, 200)
self.ui()
def ui(self):
self.label = QtWidgets.QLabel(self) # 加入 QLabel 顯示數字
self.label.setGeometry(20,10,100,40)
self.label.setStyleSheet('font-size:30px;')
self.a = 0
self.timer = QtCore.QTimer() # 加入定時器
self.timer.timeout.connect(self.count) # 設定定時要執行的 function
self.timer.start(500) # 啟用定時器,設定間隔時間為 500 毫秒
def count(self):
self.a = self.a + 1 # 數字增加 1
self.label.setText(str(self.a)) # QLabel 顯示數字
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
Form = MyWidget()
Form.show()
sys.exit(app.exec())
按鈕控制定時器
了解 QTimer 的用法後,就可以透過按鈕的方式控制定時器,下方的程式碼執行後,畫面中會有三顆按鈕,分別負責啟用 start、暫停 pause 和重設 reset,點擊按鈕後就可以看見累加的數字變化。
from PyQt6 import QtWidgets, QtCore
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
Form.setWindowTitle('oxxo.studio')
Form.resize(300, 200)
label = QtWidgets.QLabel(Form)
label.setGeometry(20,10,100,40)
label.setStyleSheet('font-size:30px;')
label.setText('0')
a = 0
def count():
global a
a = a + 1
label.setText(str(a))
timer = QtCore.QTimer()
timer.timeout.connect(count)
def start():
timer.start(500) # 啟用定時器
def pause():
timer.stop() # 停止定時器
def reset():
global a
a = 0 # 數值歸零
label.setText('0')
timer.stop() # 停止定時器
btn_start = QtWidgets.QPushButton(Form)
btn_start.setText('開始')
btn_start.setGeometry(20,70,80,30)
btn_start.clicked.connect(start) # 點擊按鈕執行 start()
btn_pause = QtWidgets.QPushButton(Form)
btn_pause.setText('暫停')
btn_pause.setGeometry(100,70,80,30)
btn_pause.clicked.connect(pause) # 點擊按鈕執行 pause()
btn_reset = QtWidgets.QPushButton(Form)
btn_reset.setText('重設')
btn_reset.setGeometry(180,70,80,30)
btn_reset.clicked.connect(reset) # 點擊按鈕執行 reset()
Form.show()
sys.exit(app.exec())
class 的寫法:
from PyQt6 import QtWidgets, QtCore
import sys
class MyWidget(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('oxxo.studio')
self.resize(300, 200)
self.ui()
def ui(self):
self.label = QtWidgets.QLabel(self)
self.label.setGeometry(20,10,100,40)
self.label.setStyleSheet('font-size:30px;')
self.label.setText('0')
self.timer = QtCore.QTimer()
self.timer.timeout.connect(self.count)
self.a = 0
self.btn_start = QtWidgets.QPushButton(self)
self.btn_start.setText('開始')
self.btn_start.setGeometry(20,70,80,30)
self.btn_start.clicked.connect(self.start) # 點擊按鈕執行 start()
self.btn_pause = QtWidgets.QPushButton(self)
self.btn_pause.setText('暫停')
self.btn_pause.setGeometry(100,70,80,30)
self.btn_pause.clicked.connect(self.pause) # 點擊按鈕執行 pause()
self.btn_reset = QtWidgets.QPushButton(self)
self.btn_reset.setText('重設')
self.btn_reset.setGeometry(180,70,80,30)
self.btn_reset.clicked.connect(self.reset) # 點擊按鈕執行 reset()
def count(self):
self.a = self.a + 1
self.label.setText(str(self.a))
def start(self):
self.timer.start(500) # 啟用定時器
def pause(self):
self.timer.stop() # 停止定時器
def reset(self):
self.a = 0 # 數值歸零
self.label.setText('0')
self.timer.stop() # 停止定時器
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
Form = MyWidget()
Form.show()
sys.exit(app.exec())
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~