一般来说,QProgressBar 的应用都会做一些延时的操作,这样就会造成主线程卡ui,PyQt中的线程可以完美地解决这个问题,本示例采用python中的time模块进行延时,并且将该延时操作放到子线程中去执行,实现Qt的UI实时刷新。
import sys import time from PyQt5.QtCore import QThread, pyqtSignal from
PyQt5.QtWidgets import QWidget, QPushButton, QProgressBar, QVBoxLayout,
QApplication class Thread(QThread): _signal = pyqtSignal(int) #定义信号类型为整型 def
__init__(self): super(Thread, self).__init__() def __del__(self): self.wait()
def run(self): for i in range(100): time.sleep(0.1) self._signal.emit(i) #发射信号
class Example(QWidget): def __init__(self): super(Example, self).__init__()
self.setWindowTitle('QProgressBar') self.btn = QPushButton('启动线程')
self.btn.clicked.connect(self.btnFunc) #连接槽函数 self.pbar = QProgressBar(self)
self.pbar.setValue(0) self.resize(300, 300) self.vbox = QVBoxLayout()
self.vbox.addWidget(self.pbar) self.vbox.addWidget(self.btn)
self.setLayout(self.vbox) self.show() def btnFunc(self): self.thread = Thread()
#实例化线程 self.thread._signal.connect(self.signal_accept)
#将线程累中定义的信号连接到本类中的信号接收函数中 self.thread.start()
#启动线程,启动线程直接调用线程中的start方法,这个方法会调用run函数,所以不用调用run函数 self.btn.setEnabled(False)
def signal_accept(self, msg): self.pbar.setValue(int(msg)) # 将线程的参数传入进度条 if
self.pbar.value() == 99: self.pbar.setValue(0) self.btn.setEnabled(True) if
__name__ == "__main__": app = QApplication(sys.argv) ex = Example() ex.show()
sys.exit(app.exec_())
效果: 

 

技术
©2019-2020 Toolsou All rights reserved,
415状态码到后台错误Vue + Element-ui的下拉框el-select获取额外参数 程序员与架构师华山论道Thread.getContextClassLoader与Thread.getClassLoader()区别shiro-oauth 启用第三方认证登录Linux 文件名合法性检测ElementUI中获取select 的label值【答学员问】你们从培训机构毕业后都找到什么工作?Centos7 下mysql8.0的安装以及修改初始密码;java中的编译时异常和运行时异常