PyQt5 – 胶囊状的进度条

当我们需要在Python窗口中添加进度条来表示某个任务的进度时,胶囊状的进度条是一种非常好用的形式。它的外观简洁而大方,而且在使用的过程中能够很好地展示进度的变化,使用户可以更加直观的了解任务的进展情况。在这里,我们将借助PyQt5提供的胶囊状进度条控件来实现这个功能。

详细步骤如下:

步骤1:安装PyQt5模块

在使用PyQt5之前,必须先安装此模块。可以使用pip包管理器来进行安装。

打开终端或命令行窗口,并输入以下命令即可完成安装:

pip install pyqt5

步骤2:导入PyQt5相关模块

完成PyQt5安装后,现在需要在Python代码中导入相关模块以便使用。我们需要导入的主要模块是:

from PyQt5.QtGui import QIcon
from PyQt5.QtCore import Qt, QThread, pyqtSignal
from PyQt5.QtWidgets import QApplication, QMainWindow, QProgressBar, QPushButton

其中,QProgressBar控件是胶囊状进度条的核心控件,QPushButton控件则用于触发进度条的更新操作。

步骤3:创建主窗口对象

在使用PyQt5的过程中,我们需要先创建一个主窗口对象,以便在其中添加各种控件,并进行布局设置。

class MainWindow(QMainWindow):

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

    def initUI(self):
        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('Capsule Progress Bar')

        # 创建进度条控件
        self.progress = QProgressBar(self)
        self.progress.setGeometry(50, 50, 200, 25)
        self.progress.setValue(0)

        # 创建按钮控件
        self.btn = QPushButton('Start', self)
        self.btn.setGeometry(100, 100, 100, 25)
        self.btn.clicked.connect(self.runTask)

    def runTask(self):
        pass

在上述代码中,我们首先创建了一个MainWindow类,继承自QMainWindow。在initUI()函数中,我们先使用setGeometry()函数设置了窗口的初始位置和大小,然后在窗口中添加了进度条和按钮控件。需要注意的是,在添加进度条控件时,我们需要设置其初始值为0,这样进度条才能展示出进度的变化情况。

此外,在添加按钮控件时,我们还通过clicked信号连接了一个名为runTask()的函数。这个函数将用于处理按钮点击事件,并在其中实现更新进度条进度的操作。

步骤4:创建后台任务线程

在PyQt5中,我们需要使用QThread类来创建后台任务线程,以便在其中执行比较耗时的任务,并在执行过程中更新进度条的进度。

class TaskThread(QThread):

    signal = pyqtSignal(int)

    def run(self):
        for i in range(101):
            self.signal.emit(i)
            self.msleep(50)

在上述代码中,我们创建了一个TaskThread类,继承自QThread类。在这个类中,我们定义了一个名为signal的信号,用于在线程执行过程中更新进度条的进度。

在run()函数中,我们模拟了一个耗时的任务,并在其中使用signal信号来实现对进度条的更新操作。需要注意的是,在每次更新进度条的进度后,线程中需要使程序休眠50毫秒,以便能够在界面上展示出进度条的变化。

步骤5:创建按钮点击事件处理函数

既然我们已经定义了线程类和主窗口类,那么现在就可以创建按钮的点击事件处理函数了。在这个函数中,我们需要创建一个TaskThread对象,启动线程执行耗时任务,并在执行过程中将进度条的进度更新到界面上。

def runTask(self):
    self.btn.setEnabled(False)

    # 创建任务线程对象
    thread = TaskThread()
    thread.signal.connect(self.progress.setValue)
    thread.finished.connect(self.threadFinished)

    # 启动后台耗时任务线程
    thread.start()

def threadFinished(self):
    self.btn.setEnabled(True)

在上述代码中,我们首先将按钮的状态设置为不可用,以免多次点击导致程序出现异常。然后创建了一个TaskThread对象,并通过connect()函数将signal信号连接到进度条的setValue()函数上。这样,当线程中更新进度条的进度时,进度条就会自动更新到界面上。

另外,在创建TaskThread对象后,我们还使用finished信号将线程的执行完成与一个名为threadFinished()的函数连接起来。在这个函数中,我们将按钮的状态设置为可用,以便用户可以继续进行下一次操作。

示例1:实现简单进度条更新

下面是一个简单的示例,展示了如何使用PyQt5的胶囊状进度条来展示图像处理的进度:

from PyQt5.QtGui import QIcon
from PyQt5.QtCore import Qt, QThread, pyqtSignal
from PyQt5.QtWidgets import QApplication, QMainWindow, QProgressBar, QPushButton

class MainWindow(QMainWindow):

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

    def initUI(self):
        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('Capsule Progress Bar')

        # 创建进度条控件
        self.progress = QProgressBar(self)
        self.progress.setGeometry(50, 50, 200, 25)
        self.progress.setValue(0)

        # 创建按钮控件
        self.btn = QPushButton('Start', self)
        self.btn.setGeometry(100, 100, 100, 25)
        self.btn.clicked.connect(self.runTask)

    def runTask(self):
        self.btn.setEnabled(False)

        # 创建任务线程对象
        thread = TaskThread()
        thread.signal.connect(self.progress.setValue)
        thread.finished.connect(self.threadFinished)

        # 启动后台耗时任务线程
        thread.start()

    def threadFinished(self):
        self.btn.setEnabled(True)


class TaskThread(QThread):

    signal = pyqtSignal(int)

    def run(self):
        for i in range(101):
            self.signal.emit(i)
            self.msleep(50)


if __name__ == '__main__':
    app = QApplication([])
    window = MainWindow()
    window.show()
    app.exec_()

在这个示例中,我们首先创建了一个MainWindow类,并在其中添加了胶囊状进度条控件和一个按钮控件。要更新进度条进度时,我们创建了TaskThread类并使用signal信号来通知主线程更新进度条的值。最终,在程序执行过程中点击按钮,进度条就会进行一次简单的更新操作。

示例2:实现复杂任务进度展示

在很多的应用场景中,涉及到的耗时任务往往比较复杂,需要很长的时间来完成。这时,我们就需要在进度条上展示更加复杂的信息,以便用户更好地了解任务的执行进度。下面是一个示例,展示了如何使用胶囊状进度条控件来展示图像处理的进度:

from PyQt5.QtGui import QIcon
from PyQt5.QtCore import Qt, QThread, pyqtSignal
from PyQt5.QtWidgets import QApplication, QMainWindow, QProgressBar, QLabel, QVBoxLayout, QWidget, QPushButton


class MainWindow(QMainWindow):

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

    def initUI(self):
        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('Capsule Progress Bar')

        # 创建进度条控件
        self.progress = QProgressBar(self)
        self.progress.setGeometry(50, 50, 200, 25)
        self.progress.setValue(0)

        # 创建标签控件
        self.label = QLabel(self)
        self.label.setGeometry(50, 80, 200, 20)
        self.label.setAlignment(Qt.AlignCenter)
        self.label.setText('Task not started')

        # 创建按钮控件
        self.btn = QPushButton('Start', self)
        self.btn.setGeometry(100, 120, 100, 25)
        self.btn.clicked.connect(self.runTask)

    def runTask(self):
        self.btn.setEnabled(False)

        # 创建任务线程对象
        thread = TaskThread()
        thread.progressSig.connect(self.updateProgress)
        thread.msgSig.connect(self.updateMsg)
        thread.finished.connect(self.threadFinished)

        # 启动后台耗时任务线程
        thread.start()

    def updateProgress(self, value):
        self.progress.setValue(value)

    def updateMsg(self, msg):
        self.label.setText(msg)

    def threadFinished(self):
        self.btn.setEnabled(True)


class TaskThread(QThread):

    progressSig = pyqtSignal(int)
    msgSig = pyqtSignal(str)

    def run(self):
        self.msgSig.emit('Loading Image...')
        self.doLoadImage()

        self.msgSig.emit('Cropping Image...')
        self.doCropImage()

        self.msgSig.emit('Applying Filters...')
        self.doApplyFilters()

        self.msgSig.emit('Saving Image...')
        self.doSaveImage()

    def doLoadImage(self):
        for i in range(101):
            self.progressSig.emit(i)
            self.msleep(10)

    def doCropImage(self):
        for i in range(101):
            self.progressSig.emit(i + 100)
            self.msleep(10)

    def doApplyFilters(self):
        for i in range(101):
            self.progressSig.emit(i + 200)
            self.msleep(10)

    def doSaveImage(self):
        for i in range(101):
            self.progressSig.emit(i + 300)
            self.msleep(10)


if __name__ == '__main__':
    app = QApplication([])
    window = MainWindow()
    window.show()
    app.exec_()

在这个示例中,我们创建了一个MainWindow类,并在其中添加了胶囊状进度条控件、标签控件和一个按钮控件。相比之前的示例,这个版本在更新进度条进度的同时,还在标签控件中展示了当前任务的执行状态,使用户能够更好地了解整个任务的进展情况。

要实现这个复杂任务的进度展示,我们在TaskThread类中定义了四个名为doLoadImage()、doCropImage()、doApplyFilters()、doSaveImage()的函数,分别用于执行不同的任务操作。在运行的过程中,我们通过信号的方式将执行进度通知到主线程,以便完成进度条和标签上的更新操作。最终,在程序运行过程中点击按钮,进度条和标签就会进行一次完整的更新操作。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PyQt5 – 胶囊状的进度条 - Python技术站

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

相关文章

  • PyQt5组合框 不可编辑时的不同边框颜色

    以下是Python中使用PyQt5组合框时,设置不可编辑时的边框颜色的完整使用攻略: 1. 概述 PyQt5是Python中的GUI(图形用户界面)编程框架,支持开发各种平台的应用程序。其中,组合框(QComboBox)是一种常用的交互控件,可用于选择一项或多项数据。 在PyQt5中,我们可以设置组合框不可编辑时的边框颜色。默认情况下,不可编辑时的边框颜色与…

    python 2023年5月11日
    00
  • PyQt5 – 悬停时为复选框设置背景图片

    以下是Python的PyQt5中如何为悬停时的复选框设置背景图片的完整使用攻略。 简介 PyQt5是Python编程语言和Qt库的结合。它使开发人员能够使用Python编写复杂的GUI应用程序,该库能够处理许多常见的GUI组件,比如单选框、复选框等等。这里将解释如何在Python的PyQt5中为悬停时的复选框设置背景图片。 实现步骤 导入所需的库文件: fr…

    python 2023年5月11日
    00
  • PyQt5 QCalendarWidget 设置一周的第一天

    这边为您详细讲解如何设置PyQt5中的QCalendarWidget一周的第一天。 什么是QCalendarWidget? QCalendarWidget是PyQt5中用于显示和选择日期的小部件。QCalendarWidget内置了一个月份平铺视图和一个年份平铺视图,可以通过信号和槽机制获取选择的日期。点击QCalendarWidget的特定日期时,该部件会…

    python 2023年5月12日
    00
  • PyQt5教程

    PyQt5是一款流行的Python GUI(图形用户界面)开发工具包,它基于Qt框架,并且能够通过Python的代码来实现各种功能的开发。本教程将介绍PyQt5的各种功能,并通过示例代码,帮助初学者学习和掌握该工具包。 一、安装PyQt5 安装PyQt5的过程十分简单,可以通过pip命令来完成安装,操作步骤如下: 打开命令行终端。 输入以下命令,安装PyQt…

    python 2023年5月12日
    00
  • PyQt5 QSpinBox – 获取点尺寸

    PyQt5是一个Python的GUI编程工具箱,其中包括了丰富的组件库,其中包括了用于数字输入的QSpinBox组件。本文将详细讲解如何在PyQt5中使用QSpinBox组件获取点尺寸。 1. QSpinBox组件概述 在PyQt5中,QSpinBox是一种数字输入框,用户可以通过调整SpinBox中的数字快速输入数字。QSpinBox中固定了一组最小值(m…

    python 2023年5月12日
    00
  • PyQt5 QDockWidget – 在它里面设置多个widget

    PyQt5 QDockWidget是一种可用于放置多个小部件(Widget)的窗口部件,它可以创建布局和作为应用程序的插件。在这里,我们将学习如何在QDockWidget中设置多个小部件,以下是完整使用攻略: 1. 引入模块 在使用QDockWidget之前,我们必须导入必要的模块。 from PyQt5.QtWidgets import QApplicat…

    python 2023年5月12日
    00
  • PyQt5 – 在开启状态下为可编辑组合框设置皮肤

    下面是Python中使用PyQt5为可编辑组合框设置皮肤的完整攻略。 1. 安装PyQt5 使用pip安装PyQt5: pip install PyQt5 2. 导入必要的模块 在Python代码中导入必要的PyQt5模块: from PyQt5.QtWidgets import (QWidget, QComboBox, QApplication, QLab…

    python 2023年5月11日
    00
  • PyQt5 QCalendarWidget – 获取子节点

    当我们在使用 PyQt5 的 QCalendarWidget 控件时,我们可能需要获取控件中的一些子节点。下面是 PyQT5 QCalendarWidget 获取子节点的完整使用攻略。 1. 获取 QCalendarWidget 子节点 在 PyQt5 中,可以使用 findChildren() 方法来获取 QCalendarWidget 控件的子节点。 #…

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