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())
微信扫码关注
抖音扫码关注