1. 程式人生 > 其它 >一個pyqt5動態載入ui+多執行緒+訊號重新整理介面的例子

一個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_()

執行效果如下: