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

 

運行效果如下:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM