请看下面的详细讲解。
简介
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中实现进度条和百分比指标,并且通过两个不同的示例,了解到如何在不同的应用场景中使用进度条。