PyQt5 | 如何在进度条的中间设置百分比指标

  • Post category:Python

请看下面的详细讲解。

简介

PyQt5是一种Python模块,使程序员可以使用Python语言编写用户界面。通过PyQt5,您可以创建应用程序窗口、图形界面、数据可视化、商业应用程序等等。

进度条是在GUI应用程序中常用的组件。通过进度条可以向用户表达任务的完成情况,进度百分比表示当前执行的进度,可以更加直观地反映程序执行的进展。

本攻略将分享如何在PyQt5的进度条中间设置百分比指标,方便用户了解当前进度。

实现步骤

1. 创建进度条

首先,我们需要创建一个PyQt5的进度条。可以使用QProgressBar函数。

import sys
from PyQt5.QtWidgets import QApplication, QProgressBar, QWidget

class ProgressBar(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Progress Bar')

        self.progressbar = QProgressBar(self)
        self.progressbar.setGeometry(30, 40, 200, 25)

        self.show()

运行以上程序,就可以看到一个基本的进度条界面。

2. 设置进度值和文本

下一步,我们需要设置进度条的值(进度百分比)和显示文本。为此,我们可以使用setValue()和setFormat()方法。

class ProgressBar(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Progress Bar')

        self.progressbar = QProgressBar(self)
        self.progressbar.setGeometry(30, 40, 200, 25)

        self.timer = QtCore.QTimer()
        self.timer.timeout.connect(self.update_text)
        self.timer.start(10)

        self.show()

    def update_text(self):
        self.progressbar.setValue(self.progressbar.value() + 1)
        self.progressbar.setFormat(f"{self.progressbar.maximum() - self.progressbar.value()}%")

这里我们创建了一个定时器,每10ms通过update_text()函数更新进度和进度显示文本。Value( )对应的是进度条的进度值,setFormat( )是一个设置进度条右侧数字格式的函数,这里用了字符串里的f-string。

3. 设置进度条样式

最后,我们可以设置进度条的样式。这里我们使用setStyleSheet()方法来设置样式表。以下是两个不同的样式。

self.progressbar.setStyleSheet("""
    QProgressBar{
        border: 2px solid grey;
        text-align: center;
        font: 12px;
    }
    QProgressBar::chunk{
        border: 2px solid red;
        background-color: red;
        width: 10px;
    }
""")
self.progressbar.setStyleSheet("""
    QProgressBar{
        border: 2px solid grey;
        text-align: center;
        font: 12px;
        color: #FFF;
        background-color: #FFF;
    }
    QProgressBar::chunk{
        border: 2px solid blue;
        background-color: blue;
        width: 10px;
        margin: 3px;
    }
""")

第一个样式使用深灰色的border,红色的背景,第二个样式使用浅灰色背景和蓝色的背景。

示例

下面是两个示例程序,演示了如何在PyQt5中使用进度条。

示例1: 使用for循环模拟计算过程,并指定更新进度条时间间隔

import sys
import time
from PyQt5.QtWidgets import QApplication, QProgressBar, QWidget
from PyQt5.QtCore import QTimer

class ProgressBar(QWidget):

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

    def initUI(self):
        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Progress Bar')
        self.progressbar = QProgressBar(self)
        self.progressbar.setGeometry(30, 40, 200, 25)

        self.timer = QTimer()
        self.timer.timeout.connect(self.update_text)
        self.timer.start(100)

        self.show()

    def update_text(self):
        MAX_VALUE = 100
        current_value = self.progressbar.value() + 1

        if current_value > MAX_VALUE:
            self.timer.stop()
            return

        self.progressbar.setValue(current_value)
        self.progressbar.setFormat(f"{current_value}%")
        QApplication.processEvents()
        time.sleep(0.05)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    pb = ProgressBar()
    sys.exit(app.exec_())

运行后,会出现一个进度条窗口,每0.05秒更新一次进度条。当进度条到达100%时,定时器停止,计算过程结束。

示例2:使用QThread类模拟复杂计算过程

import sys
import random
from PyQt5.QtCore import QThread, pyqtSignal
from PyQt5.QtWidgets import QApplication, QProgressBar, QWidget
from PyQt5.QtCore import QTimer

class CalculationThread(QThread):

    progress_update = pyqtSignal(int)

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

    def run(self):
        MAX_VALUE = 100
        for i in range(1, MAX_VALUE + 1):
            self.progress_update.emit(i)
            self.msleep(random.randint(10, 50))

        self.quit()

class ProgressBar(QWidget):

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

        self.calc_thread = CalculationThread()
        self.calc_thread.progress_update.connect(self.update_progressbar)

        self.initUI()

    def initUI(self):
        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Progress Bar')
        self.progressbar = QProgressBar(self)
        self.progressbar.setGeometry(30, 40, 200, 25)

        self.start_button = QPushButton('Start', self)
        self.start_button.move(30, 80)
        self.start_button.clicked.connect(self.start_calc)

        self.show()

    def update_progressbar(self, value):
        self.progressbar.setValue(value)
        self.progressbar.setFormat(f"{value}%")

    def start_calc(self):
        self.calc_thread.start()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    pb = ProgressBar()
    sys.exit(app.exec_())

运行后,将看到进度条界面和一个‘Start’按钮。当点击该按钮时,程序会开启一个新的线程,并在线程内部执行计算操作,每完成1%的进度将通过信号槽机制通知主线程,主线程相应地更新进度条。当计算完成时,主线程发送退出信号,线程结束。

总结

在PyQt5中设置百分比指标到进度条中间之所以受到欢迎,因为能够更直观地告诉用户当前任务有多少进度,便于用户更好地了解任务状态。通过本文,你将了解到如何在PyQt5中实现进度条和百分比指标,并且通过两个不同的示例,了解到如何在不同的应用场景中使用进度条。