🍔使用QtDesigner进行设计

我们首先使用QtDesigner设计界面
【PyQt5篇】和子线程进行通信-LMLPHP
【PyQt5篇】和子线程进行通信-LMLPHP

得到代码login.ui

<?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>478</width>
    <height>220</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Form</string>
  </property>
  <widget class="QLabel" name="label">
   <property name="geometry">
    <rect>
     <x>20</x>
     <y>30</y>
     <width>72</width>
     <height>15</height>
    </rect>
   </property>
   <property name="text">
    <string>用户名:</string>
   </property>
  </widget>
  <widget class="QLabel" name="label_2">
   <property name="geometry">
    <rect>
     <x>21</x>
     <y>74</y>
     <width>71</width>
     <height>21</height>
    </rect>
   </property>
   <property name="text">
    <string>密码:</string>
   </property>
  </widget>
  <widget class="QTextBrowser" name="textBrowser">
   <property name="geometry">
    <rect>
     <x>215</x>
     <y>20</y>
     <width>201</width>
     <height>91</height>
    </rect>
   </property>
  </widget>
  <widget class="QPushButton" name="pushButton">
   <property name="geometry">
    <rect>
     <x>10</x>
     <y>150</y>
     <width>93</width>
     <height>28</height>
    </rect>
   </property>
   <property name="text">
    <string>登录</string>
   </property>
  </widget>
  <widget class="QPushButton" name="pushButton_2">
   <property name="geometry">
    <rect>
     <x>140</x>
     <y>150</y>
     <width>93</width>
     <height>28</height>
    </rect>
   </property>
   <property name="text">
    <string>忘记密码</string>
   </property>
  </widget>
  <widget class="QLineEdit" name="lineEdit">
   <property name="geometry">
    <rect>
     <x>80</x>
     <y>30</y>
     <width>113</width>
     <height>21</height>
    </rect>
   </property>
  </widget>
  <widget class="QLineEdit" name="lineEdit_2">
   <property name="geometry">
    <rect>
     <x>80</x>
     <y>70</y>
     <width>113</width>
     <height>21</height>
    </rect>
   </property>
  </widget>
 </widget>
 <resources/>
 <connections/>
</ui>


🛸和子线程进行通信

import json
import sys
import time

from PyQt5 import uic
from PyQt5.QtCore import QThread, pyqtSignal
from PyQt5.QtWidgets import QApplication, QWidget

class LoginThread(QThread):
    #创建自定义信号
    start_login_signal=pyqtSignal(str)

    def __init__(self):
      super().__init__()

    def login_by_requests(self,user_password_json):

      # 将json字符串转换为自定义字符串,实现传递用户名和密码
      # json.loads()方法能够将符合JSON格式的字符串转换为Python的字典或列表等数据类型。
      user_password_json=json.loads(user_password_json)
      print(user_password_json.get("user_name"))
      print(user_password_json.get("password"))

    def run(self):

      # 让子线程一直存活,便于接收来自主线程的任务
      while True:
        print("子线程正在执行")
        time.sleep(1)
class MyWindow(QWidget):

  def __init__(self):
    super().__init__()
    self.init_ui()

  def init_ui(self):
    self.ui=uic.loadUi("./login.ui")

    self.user_name=self.ui.lineEdit
    self.password=self.ui.lineEdit_2
    self.login_btn=self.ui.pushButton
    self.forget_btn=self.ui.pushButton_2
    self.text_Browser=self.ui.textBrowser  #文本显示区域

    # 创建一个子线程
    self.login_thread=LoginThread()

    # 绑定信号和槽函数
    self.login_btn.clicked.connect(self.login)    #点击后,调用login函数


    
    # 将要创建的子线程类中的信号进行绑定
    # 写下self.login_thread = LoginThread()时,实际上是调用了LoginThread类,并创建了一个该类的实例对象,并将其赋值给了self.login_thread变量。
    # 简而言之,self.login_thread就是LoginThread()这个类的一个实例。

    # 当start_login_signal信号被触发时,就会自动调用login_by_requests方法来进行登录操作。
    self.login_thread.start_login_signal.connect(self.login_thread.login_by_requests)

    # 让子线程开始工作
    self.login_thread.start()

  def login(self):

    # 登录按钮的槽函数
    user_name=self.user_name.text()
    password=self.password.text()
    
    # 发送信号给子线程
    self.login_thread.start_login_signal.emit(json.dumps({"user_name":user_name,"password":password}))

if __name__=='__main__':

    app=QApplication(sys.argv)

    w=MyWindow()

    w.ui.show()

    app.exec_()

🎈运行结果

【PyQt5篇】和子线程进行通信-LMLPHP

04-08 06:01