程序实现了一个能够显示0-99数字循环进度的功能,并提供了进度查看、暂停、继续及终止操作。
import sys
import time
from PySide2.QtCore import (
QObject,
QThread,
Qt,
Signal,
QTimer,
QCoreApplication,
QEventLoop,
Slot,
)
from PySide2.QtWidgets import (
QMainWindow,
QWidget,
QVBoxLayout,
QTextEdit,
QPushButton,
QApplication,
)
class Worker(QThread):
sn_progress = Signal(str)
sn_paused = Signal()
sn_resumed = Signal()
def __init__(self, parent=None):
super().__init__(parent)
self.flag_stop = False # 标志:是否停止任务
self.flag_pause = False # 标志:是否暂停任务
def run(self):
num = 100
for i in range(num):
if self.flag_stop: # 检查是否需要停止任务的执行
return
if self.flag_pause: # 检查是否需要暂停任务的执行
self.sn_paused.emit() # 发射暂停信号
while self.flag_pause: # 循环等待直到暂停状态解除
time.sleep(0.1)
if self.flag_stop: # 如果需要停止任务,立即返回
return
self.sn_resumed.emit() # 发射恢复执行信号
self.sn_progress.emit(str(i)) # 发射进度信息信号
time.sleep(0.1) # 延迟0.1秒
def stop(self):
self.flag_stop = True # 设置停止标志
def pause(self):
self.flag_pause = True # 设置暂停标志
def resume(self):
self.flag_pause = False # 清除暂停标志
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.setWindowTitle("主窗口")
self.resize(300, 200)
self.widget = QWidget()
layout = QVBoxLayout()
self.widget.setLayout(layout)
self.setCentralWidget(self.widget)
self.text_edit = QTextEdit(self)
self.btn_start = QPushButton("开始")
self.btn_stop = QPushButton("终止")
self.btn_pause = QPushButton("暂停")
self.btn_resume = QPushButton("继续")
self.btn_stop.setEnabled(False)
self.btn_pause.setEnabled(False)
self.btn_resume.setEnabled(False)
layout.addWidget(self.text_edit)
layout.addWidget(self.btn_start)
layout.addWidget(self.btn_stop)
layout.addWidget(self.btn_pause)
layout.addWidget(self.btn_resume)
# 工作线程对象
self.worker = None
# 终止标记。终止后线程也会触发finished信号,导致界面出现结束日志
self.flag_stop = False
# 事件
self.btn_start.clicked.connect(self.start) # 开始
self.btn_stop.clicked.connect(self.stop) # 终止
self.btn_pause.clicked.connect(self.pause) # 暂停
self.btn_resume.clicked.connect(self.resume) # 继续
@Slot()
def start(self):
self.worker = Worker() # 创建工作线程
self.worker.sn_progress.connect(self.handle_sn_progress) # 处理进度
self.worker.sn_paused.connect(self.handle_sn_paused) # 处理暂停
self.worker.sn_resumed.connect(self.handle_sn_resumed) # 处理继续
self.worker.finished.connect(self.handle_sn_finished) # 处理结束
self.worker.start() # 启动工作线程
self.flag_stop = False
self.btn_start.setEnabled(False)
self.btn_stop.setEnabled(True)
self.btn_pause.setEnabled(True)
self.btn_resume.setEnabled(False)
self.text_edit.clear()
@Slot()
def stop(self):
self.worker.stop() # 调用工作线程的终止执行方法
self.flag_stop = True
self.text_edit.append("终止")
self.btn_start.setEnabled(True)
self.btn_stop.setEnabled(False)
self.btn_pause.setEnabled(False)
self.btn_resume.setEnabled(False)
@Slot()
def pause(self):
self.worker.pause() # 调用工作线程的暂停执行方法
self.btn_pause.setEnabled(False)
self.btn_resume.setEnabled(True)
@Slot()
def resume(self):
self.worker.resume() # 调用工作线程的恢复执行方法
self.btn_pause.setEnabled(True)
self.btn_resume.setEnabled(False)
@Slot()
def handle_sn_progress(self, msg):
self.text_edit.append(msg)
@Slot()
def handle_sn_paused(self):
self.text_edit.append("暂停")
@Slot()
def handle_sn_resumed(self):
self.text_edit.append("继续")
@Slot()
def handle_sn_finished(self):
if not self.flag_stop:
self.text_edit.append("结束")
self.btn_start.setEnabled(True)
self.btn_stop.setEnabled(False)
self.btn_pause.setEnabled(False)
self.btn_resume.setEnabled(False)
if __name__ == "__main__":
app = QApplication(sys.argv)
main_window = MainWindow()
main_window.show()
sys.exit(app.exec_())
标签:setEnabled,pause,False,self,stop,PySide2,延时,btn,QThread
From: https://blog.csdn.net/2402_84143950/article/details/137482246