一个pyqt5动态加载ui+多线程+信号刷新界面的例子
一个pyqt5动态加载ui+多线程+信号刷新界面的例子
ui代码(用designer设计生成即可)
<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>Form</class> <widget class="QWidget" name="Form"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>400</width> <height>300</height> </rect> </property> <property name="windowTitle"> <string>全国富婆通讯录</string> </property> <widget class="QWidget" name="formLayoutWidget"> <property name="geometry"> <rect> <x>90</x> <y>40</y> <width>211</width> <height>141</height> </rect> </property> <layout class="QFormLayout" name="formLayout"> <item row="0" column="1"> <widget class="QLineEdit" name="lineEdit"/> </item> <item row="0" column="0"> <widget class="QLabel" name="label"> <property name="text"> <string>开始寻找富婆:</string> </property> </widget> </item> <item row="2" column="0"> <widget class="QPushButton" name="pushButton"> <property name="text"> <string>开始</string> </property> </widget> </item> <item row="2" column="1"> <widget class="QPushButton" name="pushButton_2"> <property name="text"> <string>停止</string> </property> </widget> </item> </layout> </widget> </widget> <resources/> <connections/> </ui>
将ui文件转换成py类后如下:
# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'main.ui' # # Created by: PyQt5 UI code generator 5.15.2 # # WARNING: Any manual changes made to this file will be lost when pyuic5 is # run again. Do not edit this file unless you know what you are doing. from PyQt5 import QtCore, QtGui, QtWidgets class Ui_Form(object): def setupUi(self, Form): Form.setObjectName("Form") Form.resize(400, 300) self.formLayoutWidget = QtWidgets.QWidget(Form) self.formLayoutWidget.setGeometry(QtCore.QRect(90, 40, 211, 141)) self.formLayoutWidget.setObjectName("formLayoutWidget") self.formLayout = QtWidgets.QFormLayout(self.formLayoutWidget) self.formLayout.setContentsMargins(0, 0, 0, 0) self.formLayout.setObjectName("formLayout") self.lineEdit = QtWidgets.QLineEdit(self.formLayoutWidget) self.lineEdit.setObjectName("lineEdit") self.formLayout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.lineEdit) self.label = QtWidgets.QLabel(self.formLayoutWidget) self.label.setObjectName("label") self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label) self.pushButton = QtWidgets.QPushButton(self.formLayoutWidget) self.pushButton.setObjectName("pushButton") self.formLayout.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.pushButton) self.pushButton_2 = QtWidgets.QPushButton(self.formLayoutWidget) self.pushButton_2.setObjectName("pushButton_2") self.formLayout.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.pushButton_2) self.retranslateUi(Form) QtCore.QMetaObject.connectSlotsByName(Form) def retranslateUi(self, Form): _translate = QtCore.QCoreApplication.translate Form.setWindowTitle(_translate("Form", "全国富婆通讯录")) self.label.setText(_translate("Form", "开始寻找富婆:")) self.pushButton.setText(_translate("Form", "开始")) self.pushButton_2.setText(_translate("Form", "停止"))
运行代码如下:
import random import time from threading import Thread import null as null from PyQt5.QtCore import pyqtSignal from PyQt5.QtWidgets import QApplication, QWidget from ui.main import Ui_Form class MainWindow(QWidget): signal1 = pyqtSignal(str, str) # 定义带类型参数信号 stopSign = 0 thread = null woman = ["桂花", "翠花", "桂英", "桂凤", "翠芬", "桂兰", "红梅", "腊梅", "月红", "月英", "玉兰", "玉芝", "小兰", "蓉芳", "兰芳", "彩凤", "嫦娟", "招娣", "引娣"] def __init__(self): super().__init__() self.ui = Ui_Form() self.ui.setupUi(self) str = "string" self.ui.pushButton.clicked.connect(lambda: self.startThread(str)) self.ui.pushButton_2.clicked.connect(self.stopThread) self.signal1.connect(self.updateview) def startThread(self, str): self.stopSign = 0 # 关闭线程关闭标识 print(str) text = self.ui.lineEdit.text() if (self.thread != null and self.thread.isAlive()): return # 不重复开启线程 self.thread = Thread(target=self.threadSend, args=(text,) # 元组 ) self.thread.start() def stopThread(self): # 停止子线程 # self.thread.join() #这个方法的意思是阻塞其他线程包括主线程,专注于运行子线程的任务,直至子线程完成 self.stopSign = 1 # 打开线程关闭标识 self.thread.join() def threadSend(self, text): # 开启子线程,不阻塞主线程 while (self.stopSign == 0): time.sleep(0.1) item = self.woman[random.randint(0, 18)] self.signal1.emit(item, text) # 子线程不直接更新页面,发送信号让主线程去更新 def updateview(self, item, text): # 更新页面执行 self.ui.lineEdit.setText(text + "+" + item) app = QApplication([]) stats = MainWindow() stats.show() app.exec_()
运行效果如下:
暗夜之中,才见繁星;危机之下,暗藏转机;事在人为,为者常成。