PyQt5学习笔记--多线程处理、数据交互

这篇具有很好参考价值的文章主要介绍了PyQt5学习笔记--多线程处理、数据交互。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1--引入多线程的原因

2--PyQt多线程的基本知识

3--多线程登录程序的实例

4--参考


1--引入多线程的原因

① 如果Qt只采用单线程任务的方式,当遇到数据处理慢的情形时,会出现GUI卡死的情况。

② 使用下述例子展示单线程任务的缺陷:

PyQt5学习笔记--多线程处理、数据交互

③ 代码:

import sys
import time

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


class MyThread(QThread):
    def __init__(self):
        super().__init__()

    def run(self):
        for i in range(10):
            print("是MyThread线程中执行....%d" % (i + 1))
            time.sleep(1)

class MyWin(QWidget):
    def __init__(self):
        super().__init__()
        self.init_ui()
    def init_ui(self):
        self.ui = uic.loadUi("./thread.ui")

        # 从ui文件中加载控件
        line_edit = self.ui.lineEdit
        btn1 = self.ui.pushButton
        btn2 = self.ui.pushButton_2

        # 控件绑定槽函数
        btn1.clicked.connect(self.click_1)
        btn2.clicked.connect(self.click_2)
        
    def click_1(self):
        for i in range(10):
            print("是UI线程中执行....%d" % (i + 1))
            time.sleep(1)

    def click_2(self):
        self.my_thread = MyThread() # 创建线程
        self.my_thread.start() # 开始线程


if __name__ == "__main__":
    app = QApplication(sys.argv)
    myshow = MyWin()
    myshow.ui.show()
    sys.exit(app.exec_())

④ 结果展示:

当点击第一个button时,GUI会出现卡顿无法显示输出的问题;当点击第二个button时,GUI可以正常工作,输入框可以正常显示输入的内容。

PyQt5学习笔记--多线程处理、数据交互

PyQt5学习笔记--多线程处理、数据交互

2--PyQt多线程的基本知识

① 通过继承父类QThread可以新建子线程;

② 线程之间可以通过信号进行交互,并通过其槽函数执行对应的功能;

③ 常用函数:(后面会专门写一篇笔记,其内容是如何在线程之间通过信号传递opencv图片、numpy数组等数据格式)

signal = pyqtSignal(str); # 创建信号

signal.emit(json); # 发送信号

json = json.dumps(data); # 将数据序列化封装

data = json.loads(json); # 将数据还原

3--多线程登录程序的实例

① 基于Qt Designer设计 ui 文件:

PyQt5学习笔记--多线程处理、数据交互

 ② 代码:

import json
import sys
import time

from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5 import uic

# 子线程
class LoginThread(QThread):
    # 创建信号 接受字符串(这里用于主线程向子线程传递信息)
    start_login_signal = pyqtSignal(str) 

    def __init__(self, signal):
        super().__init__()
        # 信号绑定槽函数
        self.start_login_signal.connect(self.login_by_requests)

        self.login_complete_signal = signal

    def login_by_requests(self, user_password_json):
        # 将json字符串转换
        user_password_dict = json.loads(user_password_json)
        user_name = user_password_dict.get("user_name")
        password = user_password_dict.get("password")
        print(user_name, password)
        
        # 比对登录信息,返回登录状态(可自由扩充)
        if user_name == "liujinfu" and password == "liujinfu":
            self.login_complete_signal.emit(json.dumps(True)) # 返回True
        else:
            self.login_complete_signal.emit(json.dumps(False)) # 返回False

    def run(self):
        while True: # 让子线程一直运行,等待主线程(ui线程)下发的任务
            print("子线程正在等待执行....")
            time.sleep(2)

# 主线程
class MyWindow(QWidget):
    # 创建信号(这里用于子线程向主线程返回信息)
    login_status_signal = pyqtSignal(str)  

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

    def init_ui(self):
        self.ui = uic.loadUi("./login.ui")  # 加载由Qt Designer设计的ui文件

        self.user_name_qwidget = self.ui.lineEdit  # 用户名输入框
        self.password_qwidget = 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_btn.clicked.connect(self.login)

        self.login_thread = LoginThread(self.login_status_signal)  # 登录子线程
        self.login_thread.start() # 让子线程开始工作

        self.login_status_signal.connect(self.login_status)

    def login(self):
        # 实现登录函数
        self.user_name = self.user_name_qwidget.text()
        self.password = self.password_qwidget.text()
        # 发送信号,让子线程开始登录
        self.login_thread.start_login_signal.emit(json.dumps({"user_name": self.user_name, "password": self.password}))

    def login_status(self, status):
        # 根据登录状态打印信息(可自由扩充)
        if json.loads(status):
            self.text_browser.setText("Welcome %s !" % self.user_name)
            self.text_browser.repaint()
        else:
            self.text_browser.setText("User_name or password is not correct, please try again !")
            self.text_browser.repaint()

if __name__ == '__main__':
    app = QApplication(sys.argv)  # 创建对象

    w = MyWindow()
    # 展示窗口
    w.ui.show()

    # 程序进行循环等待状态
    app.exec_()

③ 结果展示:

PyQt5学习笔记--多线程处理、数据交互

PyQt5学习笔记--多线程处理、数据交互

注:后面会专门写一篇笔记,其内容是如何在线程之间通过信号传递opencv图片、numpy数组等数据格式

4--参考

PyQt5 快速入门文章来源地址https://www.toymoban.com/news/detail-415527.html

到了这里,关于PyQt5学习笔记--多线程处理、数据交互的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • PyQt5 QWebEngineView网页交互

    方法 描述 load(QUrl url) 加载指定的URL并显示 setHtml(QString html) 将网页视图的内容设置为指定的HTML内容 核心代码: view = QWebEngineView() view.load(QUrl(‘http://www.xxx.com’)) view.show()

    2023年04月19日
    浏览(38)
  • 实习记录(5)——PyQT5界面设计及交互

    首先按照甲方PPT上给的界面做了,在写内部逻辑的时候发现有不少问题,没考虑到使用者的感受,甚至我觉得根本用不了。于是我和小哥讨论了一下之后,我按照我的想法做了一个新的页面出来,能实现需求的同时,让使用的人体验更好也更直观。 昨天安装成功了PyQT5,今天

    2023年04月24日
    浏览(40)
  • pyqt5 如何终止正在执行的线程?

    在 PyQt5 中终止正在执行的线程,可以通过一些协调的方法来实现。一般情况下,直接强行终止线程是不安全的,可能会导致资源泄漏或者程序异常。相反,我们可以使用一种协作的方式,通知线程在合适的时候自行退出。 以下是一种常见的方法,使用标志位来通知线程停止

    2024年02月14日
    浏览(41)
  • PyQt5多线程的执行和停止

    参考资料:哔哩哔哩 pyqt5 thread多线程示例 以下代码来自该视频,我自己手动实现了一下,当作一个模板来学习,欢迎大家一起学习。 运行示例 三个进程同时执行,并且可以单独控制暂停和继续执行。 以下给出运行代码: 完整程序参考:PyQt5 多线程执行和停止示例

    2024年02月16日
    浏览(38)
  • python pyqt5 如何点击按钮,打开文件夹选择目录

    您可以使用PyQt5的QFileDialog类来实现打开文件夹选择目录的功能。下面是一个示例代码,演示了如何创建一个窗口,包含一个按钮,点击按钮后弹出文件夹选择对话框并返回所选目录的路径: import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QFileDialog class MainWindow(Q

    2024年02月10日
    浏览(64)
  • 探索文件与交互:使用PyQt5构建一个高级文件选择器

    在当今的应用程序开发中,文件管理和交互是一个重要的组成部分。特别是对于桌面应用程序,提供一个直观、功能丰富的文件选择器是提高用户体验的关键。 本篇博客,我将介绍如何使用Python和PyQt5来构建一个高级的文件选择器,它不仅能浏览文件,还能预览图片,编辑文

    2024年01月24日
    浏览(45)
  • Pyqt5实现新线程更新窗口UI

    我们用pyqt5开发窗口应用时,应用会执行一些耗时的操作,如复制大量文件,下载大量数据等。一般情况下,在这些操作没有完成时,窗口的UI处于“假死”状态,不会更新,只有所有操作完成后,窗口的状态才会更新。这样对用户使用非常不友好。 使用多线程技术,在新线

    2024年02月13日
    浏览(45)
  • PyQt5 多线程和异步刷新UI

    以下简介一个基本的PyQt程序。 需要导入的类主要来自三个包 from PyQt5.QtWidgets import 常用的控件 PyQt5.QtCore 核心功能类,如QT,QThread,pyqtSignal PyQt5.QtGui UI类,如QFont 基础的程序结构: 注意: 使用join方法会让主线程阻塞在这里,等待子线程结束,在里面可以设置阻塞的时间 a

    2024年02月11日
    浏览(41)
  • PyQt5之事件处理

    Widget - event 基于窗体的应用程序都是由事件驱动的,列如:鼠标事件(鼠标的单击双击)、键盘事件(按键的按下释放)、窗体绘制事件(某个事件的重绘)等,产生的事件进入一个事件队列,由应用程序的事件循环进行处理。 在PyQt5中,事件是一种对象,由抽象类QEvent表示

    2024年02月11日
    浏览(51)
  • 【PyQt5实现多线程更新UI】- 提高程序效率,优化用户体验

    【PyQt5实现多线程更新UI】- 提高程序效率,优化用户体验 在PyQt5应用程序的开发中,当程序需要处理大量数据或进行复杂的计算时,如果仅使用主线程,会导致GUI界面失去响应,用户体验较差。为了解决这个问题,通常需要使用多线程技术。 而在使用多线程时,往往需要更新

    2024年02月07日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包