Qthread使用记录
通过使用pyqt5核心内容——Qthread来实现多线程工作
例如定时器功能:每n秒运行一件事
可能会有人说用Python自带得threading模块
答案:可以代替,但是经过亲测在pyqt5种使用threading会出现不稳定的情况。
例如每秒更新表格数据会出现数据一闪一闪、延迟性出现等症状。所以学会Qthread在Pyqt5中是必不可少得。
使用Qthread的对比如下:
点击Run按钮后界面出现未响应字样,同时程序也没有出现每隔1秒打印1个数字,实际结果是循环结束后20个数字一同展示:
下面给出代码模板:
main.py
import sys
import time
from PyQt5.QtCore import QThread, pyqtSignal
from PyQt5.QtWidgets import QApplication, QMainWindow
from fff import Ui_Form
class MyMainForm(QMainWindow, Ui_Form):
def __init__(self, parent=None):
super(MyMainForm, self).__init__(parent)
self.setupUi(self)
# 实例化线程对象
self.work = WorkThread()
# 关联按钮
self.runButton.clicked.connect(self.execute)
self.runButton_2.clicked.connect(self.qqq)
# 子线程接收函数,里面一般不用动
def execute(self):
# 启动线程
self.work.start()
# 线程自定义信号连接的槽函数
self.work.trigger.connect(self.display)
# 子线程函数,里面放每秒运行的函数或操作都可以
def display(self,str):
# 由于自定义信号时自动传递一个字符串参数,所以在这个槽函数中要接受一个参数
self.listWidget.addItem(f"第二个线程_{str}")
def qqq(self):
self.listWidget.addItem('第一个线程(主线程)')
class WorkThread(QThread):
# 自定义信号对象。参数str就代表这个信号可以传一个字符串
trigger = pyqtSignal(str)
def __int__(self):
# 初始化函数
super(WorkThread, self).__init__()
def run(self):
#重写线程执行的run函数
#触发自定义信号
for i in range(20):
time.sleep(1)
# 通过自定义信号把待显示的字符串传递给槽函数
self.trigger.emit(str(i))
if __name__ == "__main__":
app = QApplication(sys.argv)
myWin = MyMainForm()
myWin.show()
sys.exit(app.exec_())
fff.py
# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(498, 331)
self.runButton = QtWidgets.QPushButton(Form)
self.runButton.setGeometry(QtCore.QRect(160, 30, 75, 23))
self.runButton.setObjectName("runButton")
self.runButton_2 = QtWidgets.QPushButton(Form)
self.runButton_2.setGeometry(QtCore.QRect(260, 30, 75, 23))
self.runButton_2.setObjectName("runButton_2")
self.listWidget = QtWidgets.QListWidget(Form)
self.listWidget.setGeometry(QtCore.QRect(30, 70, 431, 192))
self.listWidget.setObjectName("listWidget")
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Qthread Example"))
self.runButton.setText(_translate("Form", "Run1"))
self.runButton_2.setText(_translate("Form", "Run2"))
运行后的结果:
点击run2后,界面更改
先点击run1后,在点击run2,可以看到互不影响,run每秒进行输出