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 QDoubleSpinBox – 使其不可编辑

    PyQt5中的QDoubleSpinBox可以让用户在界面上输入有小数点的数值,并且有自带的上下调整按钮,方便用户进行数值的调整。有时候我们需要将QDoubleSpinBox设置为只读或不可编辑状态,本文将为您介绍如何实现这个功能。 设置QDoubleSpinBox为只读状态 要实现这个功能,我们需要使用QDoubleSpinBox的setReadOnly方…

    python 2023年5月13日
    00
  • PyQt5 QSpinBox – 获取字体的最小左方位

    PyQt5是Python语言中常用的GUI编程框架之一,QSpinBox控件是其中一个常用的部件,用于对数值进行输入和显示。在QSpinBox中,我们可以通过setFont方法来设置控件中文字的字体,通过font方法可以获取控件中文字的字体信息,包括最小左方位的值。下面是PyQt5 QSpinBox-获取字体的最小左方位的完整使用攻略。 获取QSpinBox…

    python 2023年5月12日
    00
  • PyQt5 QDoubleSpinBox – 设置最小可能值

    使用PyQt5设置QDoubleSpinBox的最小可能值 QDoubleSpinBox是PyQt5中的一个小部件,用于使用户能够输入带浮点数的数字。 QDoubleSpinBox支持对可以输入的最小和最大值进行配置。在本文中,我们将重点介绍如何设置QDoubleSpinBox的最小可能值。 设置最小可能值 要设置QDoubleSpinBox的最小可能值,可…

    python 2023年5月13日
    00
  • PyQt5 – 如何改变复选框被按下时的背景颜色

    PyQt5是Python语言的一个GUI编程工具,可以用来创建桌面应用程序。其中,复选框是GUI编程中常用的一个UI元素。本篇攻略将带你完整了解如何用PyQt5改变复选框被按下时的背景颜色。 修改复选框被按下时的背景颜色 方法一:使用QSS(Qt风格表单) Qt风格表单是一种为Qt应用程序设计独特风格的表单,它可以通过向控件添加类似于CSS的样式来改变控件的…

    python 2023年5月10日
    00
  • PyQt5 QDial 获得上限值

    首先,我们需要先了解QDial控件以及其属性。QDial是PyQt5中的一个滑动条控件,可以通过设置最小值、最大值、当前值和步长来控制其滑动范围和精度。在此基础上,我们可以通过调用QDial的maximum()方法来获取最大值,示例代码如下: import sys from PyQt5.QtWidgets import QApplication, QMain…

    python 2023年5月12日
    00
  • PyQt5 – 为组合框设置背景图片

    下面是详细讲解python中PyQt5组合框设置背景图片的完整使用攻略。 环境准备 在使用PyQt5之前,需要先安装好相关依赖包。 安装Qt5开发框架,可根据操作系统选择相应版本安装,下载地址:https://www.qt.io/download 安装PyQt5,使用pip安装: pip install pyqt5 示例一 在这个示例中,我们将创建一个简单的…

    python 2023年5月11日
    00
  • PyQt5 QSpinBox – 检查它是否是活动窗口

    首先,PyQt5是Python的一种GUI工具包,而QSpinBox是PyQt5中的一个构件,提供了一个可自行增加或减少数字值的控件。在使用QSpinBox时,我们想要检查它是否是活动窗口,可以通过以下步骤来实现: 导入必要的模块 在使用QSpinBox前,我们需要导入PyQt5模块以及要使用的控件类。代码如下: from PyQt5.QtWidgets i…

    python 2023年5月12日
    00
  • PyQt5 QCommandLinkButton – 获取自动默认属性

    PyQt5是基于Python的Qt图形用户界面框架,支持各种控件和布局,其中包括QCommandLinkButton控件。QCommandLinkButton控件是一个可用于单击操作的自定义控件,可用于显示有关已执行命令的详细信息。 获取QCommandLinkButton自动默认属性,可以使用QCommandLinkButton的defaultAction…

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