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


在这里插入图片描述

🍔使用QtDesigner进行设计

我们首先使用QtDesigner设计界面
在这里插入图片描述
在这里插入图片描述

得到代码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_()

🎈运行结果

在这里插入图片描述

  • 26
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 20
    评论
PyQt5中,子线程不能直接访问UI控件,因为PyQt5只能在主线程中更新UI。但您可以通过信号和槽机制在主线程和子线程之间进行通信。 以下是一个例子,演示了如何在子线程中获取窗口控件的内容并将其发送到主线程: ```python from PyQt5.QtCore import QThread, pyqtSignal from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QLineEdit, QPushButton, QLabel import sys class Worker(QThread): finished = pyqtSignal(str) def __init__(self, parent=None): super().__init__(parent) def run(self): # 在这里调用子线程需要执行的任务,例如获取窗口控件内容 content = "子线程获取到的内容" self.finished.emit(content) class Window(QWidget): def __init__(self, parent=None): super().__init__(parent) self.resize(400, 300) self.lineEdit = QLineEdit() self.pushButton = QPushButton("获取内容") self.label = QLabel() layout = QVBoxLayout(self) layout.addWidget(self.lineEdit) layout.addWidget(self.pushButton) layout.addWidget(self.label) self.pushButton.clicked.connect(self.start_worker) self.worker = Worker() self.worker.finished.connect(self.update_label) def start_worker(self): self.worker.start() def update_label(self, content): self.label.setText(content) if __name__ == '__main__': app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_()) ``` 在这个例子中,我们创建了一个`Worker`类,它继承自`QThread`类,并包含一个`finished`信号。在`run`方法中,我们可以执行子线程需要执行的任务,例如获取窗口控件内容,并通过`finished`信号将结果发送到主线程。 在`Window`类中,我们创建了一个`Worker`实例,并将其`finished`信号连接到`update_label`方法。在`start_worker`方法中,我们启动子线程。当子线程完成并发出`finished`信号时,`update_label`方法将被调用,主线程中的标签控件将更新为子线程获取到的内容。 您可以根据您的具体需求修改代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在下小吉.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值