Pyside2 (Qt For Python) プログレスバー関数の実装
プログレスバー (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()とsetMinimum()を使用して指定できます。デフォルト値は 0 と 99 です。
- 現在のステップは**setValue()** によって設定されます
- プログレスバーは、 reset()メソッドを通じて再開できます。
-
最小値と最大値の両方が 0、つまり setRange(0, 0) に設定されている場合、以下に示すように、バーにはステップのパーセンテージの代わりにビジー インジケーターが表示されます。
プログレスバーの高度な例
通常、進行状況バーを使用するときは、特定のタスクの進行状況に関連付けられます。一般的な状況が 2 つあります。
-
データとバインドします。たとえば、操作の対象が大量のデータである場合、プログレス バーの範囲をデータの合計量に設定できます。対応するデータ量が増加するたびに、プログレス バーが更新されます。走る。
- 以下は、データ ボリュームとプログレス バーをバインドするコード例です。
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_())