今天来介绍PySide2进度条(QProgressBar)的使用,如下所示:
进度条也是一个常用的控件,当程序需要做一件比较耗费时间的任务(比如统计数据,下载文件等)时,可以用来向用户指示操作的进度。而且有了进度显示,用户就知道应用程序仍在运行,并没有出问题。
QProgressBar进度条把每个进度称之为一个step(步骤)。
我们可以通过它的 setRange
方法设定步骤个数,比如
progressBar.setRange(0,10)
以上代码将进度分为5步。然后,通过 setValue
方法,指定当前完成到了哪一步,比如:
progressBar.setValue(7)
就表示完成了 7/10, 也就是 70%, 进度条就会显示70%的进度。
import time
from PySide2.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QPushButton, QProgressBar
from PySide2.QtCore import QThread, Signal
class Worker(QThread):
progress = Signal(int)
def run(self):
for i in range(101):
time.sleep(0.1) # 模拟耗时操作
self.progress.emit(i)
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("进度条")
self.setGeometry(100, 100, 300, 150)
self.central_widget = QWidget(self)
self.setCentralWidget(self.central_widget)
self.layout = QVBoxLayout()
self.central_widget.setLayout(self.layout)
self.progress_bar = QProgressBar(self)
self.layout.addWidget(self.progress_bar)
self.button = QPushButton("开始", self)
self.button.clicked.connect(self.start_process)
self.layout.addWidget(self.button)
def start_process(self):
self.worker = Worker()
self.worker.progress.connect(self.update_progress)
self.worker.start()
def update_progress(self, value):
self.progress_bar.setValue(value)
if __name__ == "__main__":
app = QApplication([])
window = MainWindow()
window.show()
app.exec_()
可以使用 setMinimum() 和 setMaximum() 指定最小和最大 steps;默认值是0和99。
如果最小值和最大值都设置为0,也就是将setRange(0, 0),那么栏会显示一个繁忙的指示符,而不是步骤的百分比,如下所示:
通常,我们在使用进度条的时候,一般要同具体的任务进度绑定,常见的有两种情况:
同数据进行绑定,例如操作的对象是大量的数据,可以将进度条的范围设置为总数据量,每运行相应的数据量,进度条随之更新
total_rows = len(list(sheet1.iter_rows())) # 获取总行数
current_row = 0 # 设置当前运行行数
current_row += 1 # 每运行一行,变量自动+1
progress = int(current_row / total_rows * 100)
compareWin.update_progress_bar(100) # 更新进度条
同线程进行绑定,如果当前的项目存在多线程运行的情况,可以将进度条和线程进行绑定,方便实时反映程序运行情况,以下是线程和进度条绑定的代码示例
import sys
from PySide2.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QProgressBar
from PySide2.QtCore import QThread, Signal
class WorkerThread(QThread):
# 定义一个信号,用于更新进度条
update_progress = Signal(int)
def run(self):
for i in range(101):
# 发送信号,更新进度条
self.update_progress.emit(i)
self.msleep(50) # 模拟耗时操作
class MainWindow(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('进度条和线程绑定示例')
self.setGeometry(100, 100, 400, 200)
# 创建垂直布局
layout = QVBoxLayout(self)
# 创建进度条
self.progress_bar = QProgressBar(self)
layout.addWidget(self.progress_bar)
# 创建按钮,点击按钮启动线程
self.start_button = QPushButton('开始', self)
self.start_button.clicked.connect(self.startThread)
layout.addWidget(self.start_button)
self.setLayout(layout)
def startThread(self):
# 创建线程实例
self.thread = WorkerThread()
# 将线程的信号连接到更新进度条的槽函数
self.thread.update_progress.connect(self.updateProgressBar)
# 启动线程
self.thread.start()
# 禁用按钮,防止多次点击
self.start_button.setEnabled(False)
def updateProgressBar(self, value):
# 更新进度条的值
self.progress_bar.setValue(value)
# 如果进度达到100%,启用按钮
if value == 100:
self.start_button.setEnabled(True)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())