Pyside2(Python용 Qt) 진행률 표시줄 기능 구현
진행률 표시줄(QProgressBar)
오늘은 아래와 같이 PySide2 진행률 표시줄( QProgressBar ) 사용을 소개하겠습니다 .
설명하다
진행률 표시줄은 일반적으로 사용되는 컨트롤이기도 하며, 프로그램이 시간이 많이 걸리는 작업(예: 통계, 파일 다운로드 등)을 수행해야 할 때 사용자에게 작업 진행 상황을 표시하는 데 사용할 수 있습니다 . 그리고 진행률 표시를 통해 사용자는 애플리케이션이 여전히 실행 중이고 문제가 없음을 알 수 있습니다.
QProgressBar 진행 표시줄은 각 진행 상황을 단계로 호출합니다.
다음과 같은 메소드를 통해 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() 을 사용하여 지정할 수 있으며 기본값은 0과 99입니다.
- 현재 단계는 **setValue()**에 의해 설정됩니다.
- 진행 표시줄은 Reset() 메서드를 통해 다시 시작할 수 있습니다.
-
최소값과 최대값이 모두 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_())