PyQt5 pyqt多线程操作入门

yizhihongxing

PyQt5 是一组 Python 绑定 Qt 库的 Python 模块,支持开发界面程序。通过多线程操作可以提升程序的运行效率和用户体验。以下是一份关于 PyQt5 多线程操作入门的攻略。

环境搭建

在开发 PyQt5 多线程程序前,我们需要先准备好以下两个软件的安装:

  1. Python 3.x。可前往官网下载并安装。

  2. PyQt5 模块。使用 pip 命令安装,终端输入:

pip install PyQt5

多线程操作示例

示例 1:通过继承 QThread 类实现多线程任务

import sys
from PyQt5.QtCore import QThread, pyqtSignal
from PyQt5.QtWidgets import QApplication, QMainWindow, QProgressBar, QPushButton


class MyThread(QThread):
    """自定义线程类"""
    thread_signal = pyqtSignal(int)

    def __init__(self, start=1, end=100):
        super().__init__()
        self.start_value = start
        self.end_value = end

    def run(self):
        """线程任务"""
        for i in range(self.start_value, self.end_value):
            self.thread_signal.emit(i)


class MainWindow(QMainWindow):
    """主窗口类"""
    def __init__(self):
        super().__init__()
        self.p_bar = QProgressBar(self)
        self.p_bar.setGeometry(50, 70, 200, 25)
        self.btn = QPushButton("Start", self)
        self.btn.setGeometry(80, 120, 120, 25)

        self.thread = MyThread()
        self.thread.thread_signal.connect(self.update_progress)
        self.btn.clicked.connect(self.thread.start)
        self.setGeometry(300, 300, 300, 200)

    def update_progress(self, value):
        """更新进度条"""
        self.p_bar.setValue(value)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = MainWindow()
    win.show()
    sys.exit(app.exec_())

该示例程序创建了一个新的线程,该线程从 start 到 end 值间的整数依次输出。点开开始按钮,线程任务在新线程中执行,同时主窗口中的进度条也会相应更新。通过这个示例,我们可以了解到,QThread 是实现线程操作的一种常用方式。

示例 2:通过继承 QObject 类实现 QObject 多线程管理

import sys
from PyQt5.QtCore import QObject, pyqtSignal, pyqtSlot, QThread
from PyQt5.QtWidgets import QApplication, QMainWindow, QProgressBar, QPushButton


class MyWorker(QObject):
    """基于QObject的工作进程"""
    progress_changed = pyqtSignal(int)

    @pyqtSlot()
    def do_work(self):
        """工作任务"""
        for i in range(1, 101):
            self.progress_changed.emit(i)


class MyThread(QThread):
    """基于QThread的线程类"""
    def __init__(self, worker):
        super().__init__()
        self.worker = worker

    def run(self):
        """线程任务"""
        self.worker.do_work()


class MainWindow(QMainWindow):
    """主窗口类"""
    def __init__(self):
        super().__init__()
        self.p_bar = QProgressBar(self)
        self.p_bar.setGeometry(50, 70, 200, 25)

        self.btn = QPushButton("Start", self)
        self.btn.setGeometry(80, 120, 120, 25)

        self.worker = MyWorker()

        self.thread = MyThread(self.worker)
        self.worker.progress_changed.connect(self.update_progress)
        self.btn.clicked.connect(self.thread.start)

        self.setGeometry(300, 300, 300, 200)

    def update_progress(self, value):
        """更新进度条"""
        self.p_bar.setValue(value)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = MainWindow()
    win.show()
    sys.exit(app.exec_())

该示例程序创建了一个新的线程,该线程启动 worker 任务,并且基于 Qt 的 QObject 类来实现报告信号和进度 moved 信号。点开开始按钮,线程任务在新线程中执行,同时主窗口中的进度条也会相应更新。通过这个示例,我们可以了解到,QObject 和 QThread 是共同实现多线程操作的最佳方式。

总结

通过上述的两个示例,我们了解并应用了 QThread 和 QObject 类多线程操作的实现方式。当我们需要同时处理和展示大量的数据时,多线程操作可以有效提高我们的程序效率和用户体验。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PyQt5 pyqt多线程操作入门 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • python使用urllib2实现发送带cookie的请求

    下面是 Python 使用 urllib2 实现发送带 cookie 的请求的完整攻略: 1. 引入 urllib2、cookielib 库 Python 2.x 中 urllib2 必须要手动引入 cookielib 库才能使用 cookie 功能,所以我们需要在代码中引入这两个库: import urllib2 import cookielib 2. 构…

    python 2023年6月3日
    00
  • Python3实现的回文数判断及罗马数字转整数算法示例

    下面我将对“Python3实现的回文数判断及罗马数字转整数算法示例”的完整攻略进行详细讲解。 回文数判断 算法实现思路 回文数具有对称的特点,例如121、1221等。判断一个数是否为回文数的思路是将其反转后,若与原数相等则为回文数。 因为Python中字符串可以直接进行反转,所以可以将整数转换为字符串,然后反转后比较即可。 代码实现 def isPalind…

    python 2023年6月5日
    00
  • Python+Matplotlib实现给图像添加文本标签与注释

    下面是Python+Matplotlib实现给图像添加文本标签与注释的详细攻略,具体步骤如下: 准备工作 安装Matplotlib库,可以使用pip install matplotlib命令进行安装。 导入Matplotlib库中的pyplot模块,使用以下代码: import matplotlib.pyplot as plt 准备数据。这里我们以两组简单的…

    python 2023年5月18日
    00
  • Python 使用 PyMysql、DBUtils 创建连接池提升性能

    标题:Python 使用 PyMysql、DBUtils 创建连接池提升性能 背景 Python 是一门流行的编程语言,在访问数据库时使用 PyMySQL 可以很方便的实现数据的增、删、改、查。然而,在高并发场景下,每次都建立连接的方式效率低下,因此需要使用连接池技术。 连接池介绍 连接池是一组已经建立好的数据库连接对象集合,连接池在项目启动后就预先创建好,…

    python 2023年6月6日
    00
  • Python格式化输出–%s,%d,%f的代码解析

    Python格式化输出是Python中常用的输出方式之一,可以将输出内容按照指定格式进行输出。其中,常用的格式化输出符包括%s、%d、%f等。 %s格式输出字符串数据类型,例如: name = "John" print("My name is %s" % name) 输出结果为: My name is John %d用…

    python 2023年6月5日
    00
  • python3实现字符串的全排列的方法(无重复字符)

    下面我来为您讲解一下“Python3实现字符串的全排列的方法(无重复字符)”的完整攻略。 什么是字符串的全排列? 字符串的全排列是指把一个字符串中所有字符的组合都找出来,比如说对于字符串”abc”,其全排列包括: “abc”, “acb”, “bac”, “bca”, “cab”, “cba” 算法思路 使用递归的方法来实现,对于给定的字符串,从第一个字符开…

    python 2023年6月5日
    00
  • 用Python提取PDF表格的方法

    关于用Python提取PDF表格的方法,我分享以下完整攻略: 1. 安装必要的Python库 在使用Python提取PDF表格之前,需要安装几个必要的Python库,分别是tabula-py、pandas、numpy和ghostscript。其中tabula-py是用于提取表格,pandas和numpy则是用于处理数据,ghostscript是用于处理PDF…

    python 2023年5月18日
    00
  • Bootstrap树形菜单插件TreeView.js使用方法详解

    Bootstrap树形菜单插件TreeView.js使用方法详解 简介 Bootstrap是一个流行的前端框架,提供了丰富的UI组件,包括菜单组件。Bootstrap菜单组件提供了多样的展示效果,包括树形菜单。而TreeView.js是一款基于Bootstrap的树形菜单插件,使得树形菜单功能更加强大且易于实现。 安装 TreeView.js需要依赖于Boo…

    python 2023年6月13日
    00
合作推广
合作推广
分享本页
返回顶部