PyQt5 pyqt多线程操作入门

2023-12-16Python编程
57

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 类多线程操作的实现方式。当我们需要同时处理和展示大量的数据时,多线程操作可以有效提高我们的程序效率和用户体验。

The End

相关推荐

解析Python中的eval()、exec()及其相关函数
Python中有三个内置函数eval()、exec()和compile()来执行动态代码。这些函数能够从字符串参数中读取Python代码并在运行时执行该代码。但是,使用这些函数时必须小心,因为它们的不当使用可能会导致安全漏洞。...
2023-12-18 Python编程
117

Python下载网络文本数据到本地内存的四种实现方法示例
在Python中,下载网络文本数据到本地内存是常见的操作之一。本文将介绍四种常见的下载网络文本数据到本地内存的实现方法,并提供示例说明。...
2023-12-18 Python编程
101

Python 二进制字节流数据的读取操作(bytes与bitstring)
来给你详细讲解下Python 二进制字节流数据的读取操作(bytes与bitstring)。...
2023-12-18 Python编程
120

Python3.0与2.X版本的区别实例分析
Python 3.x 是 Python 2.x 的下一个重大版本,其中有一些值得注意的区别。 Python 3.0中包含了许多不兼容的变化,这意味着在迁移到3.0之前,必须进行代码更改和测试。本文将介绍主要的差异,并给出一些实例来说明不同点。...
2023-12-18 Python编程
34

python如何在终端里面显示一张图片
要在终端里显示图片,需要使用一些Python库。其中一种流行的库是Pillow,它有一个子库PIL.Image可以加载和处理图像文件。要在终端中显示图像,可以使用如下的步骤:...
2023-12-18 Python编程
91

Python图像处理实现两幅图像合成一幅图像的方法【测试可用】
在Python中,我们可以使用Pillow库来进行图像处理。具体实现两幅图像合成一幅图像的方法如下:...
2023-12-18 Python编程
103