zoukankan      html  css  js  c++  java
  • 一个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_()

    运行效果如下:

    暗夜之中,才见繁星;危机之下,暗藏转机;事在人为,为者常成。
  • 相关阅读:
    Ionic Js十:加载动作
    Ionic Js九:列表操作
    Ionic Js八:头部和底部
    Ionic Js七:手势事件
    库文件
    驱动知识
    自启动总结
    学习笔记
    写脚本切换用户
    未找到arm-linux-gcc解决办法
  • 原文地址:https://www.cnblogs.com/zenghansen/p/14954415.html
Copyright © 2011-2022 走看看