pyQt5不让进度条卡住
这里我们用一个更新程序做示例, 下载文件的过程中让进度条实时显示下载进度。
如果下载和更新进度条的工作都放在一个线程中,会出现进度条卡顿的情况。
正确的做法是把界面刷新和工作任务交给不同的线程去运行,然后用信号同步。

# _*_ coding: utf-8 _*_
import os
import sys
import subprocess
from PyQt5.QtCore import (QThread, pyqtSignal, QRect)
from PyQt5.QtWidgets import (QApplication, QDesktopWidget, QProgressBar, QWidget, QLabel, QFrame, QPushButton)
from PyQt5.QtGui import (QIcon, QPixmap)
import requests
import zipfile
import json class dfThread(QThread):
_signal = pyqtSignal(int, str, str) def __init__(self, download_url, filesize, fileobj, buffer):
super().__init__()
self.download_url = download_url
self.filesize = filesize
self.fileobj = fileobj
self.buffer = buffer def run(self):
try:
f = requests.get(self.download_url, stream=True)
offset = 0
for chunk in f.iter_content(chunk_size=self.buffer):
if not chunk:
break
self.fileobj.seek(offset)
self.fileobj.write(chunk)
offset = offset + len(chunk)
proess = offset / int(self.filesize) * 100
self._signal.emit(int(proess), str(offset), str(self.filesize))
self.fileobj.close()
self.exit(0)
except Exception as e:
print(e) class zipFile(object):
def __init__(self, filename, mode='r', basedir=''):
self.filename = filename
self.mode = mode
if self.mode in ('w', 'a'):
self.zfile = zipfile.ZipFile(filename, self.mode, compression=zipfile.ZIP_DEFLATED)
else:
self.zfile = zipfile.ZipFile(filename, self.mode)
self.basedir = basedir
if not self.basedir:
self.basedir = os.path.dirname(filename) def close(self):
self.zfile.close() def extract_to(self, path):
for p in self.zfile.namelist():
self.extract(p, path) def extract(self, filename, path):
if not filename.endswith('/'):
f = os.path.join(path, filename)
dir = os.path.dirname(f)
if not os.path.exists(dir):
os.makedirs(dir)
try:
open(f, 'wb').write(self.zfile.read(filename))
except IOError:
pass class updateFrm(QWidget):
def __init__(self):
super().__init__()
self.mainfn = 'QQ'
#self.fileuri = 'http://a.b.cn/serv/update/%s.zip' % self.mainfn
self.fileuri = 'https://dldir1.qq.com/qqfile/qq/PCQQ9.1.1/24953/QQ9.1.1.24953.exe'
#self.servurl = 'http://a.b.cn/serv/version'
self.baseTitle = 'QQ升级助手'
self.initUI() def initUI(self):
self.info = QLabel(self)
self.info.move(65, 28)
self.info.resize(360, 40) map = QLabel(self)
map.move(30, 25)
img = QPixmap('res\\info.png')
map.setPixmap(img) self.tips = QLabel(self)
self.tips.move(420, 55)
self.tips.resize(30, 10)
self.tips.hide() self.line = QFrame(self)
self.line.setGeometry(QRect(0, 75, 500, 75))
self.line.setFrameShape(QFrame.HLine)
self.line.setFrameShadow(QFrame.Sunken)
self.line.setObjectName("line") self.btnQuit = QPushButton(self)
self.btnQuit.setText("取消")
self.btnQuit.setGeometry(380, 120, 100, 30)
self.btnQuit.clicked.connect(self.cancel)
self.btnQuit.hide() self.btnStart = QPushButton(self)
self.btnStart.setText('立即更新')
self.btnStart.setGeometry(380, 120, 100, 30)
self.btnStart.clicked.connect(self.start) self.bar = QProgressBar(self)
self.bar.setGeometry(0, 110, 530, 2)
self.bar.setMaximum(100)
self.bar.hide() self.setFixedSize(500, 160)
self.center()
self.setWindowTitle(self.baseTitle)
icon = QIcon()
icon.addPixmap(QPixmap("res\\6.ico"), QIcon.Normal, QIcon.Off)
self.setWindowIcon(icon) try:
#res = requests.get(self.servurl)
#obj = json.loads(res.text)
obj = {
'title': '发现新版本',
'desc' : 'PCQQ 9.1.1 全新改版,给你焕然一新的感觉'
}
txt = '%s\n\n%s' % (obj['title'], obj['desc'])
except Exception as e:
txt = '未发现新版本\n\n'
self.btnStart.setDisabled(True)
self.info.setText(txt) self.show() def center(self):
qr = self.frameGeometry()
cp = QDesktopWidget().availableGeometry().center()
qr.moveCenter(cp)
self.move(qr.topLeft()) def cancel(self):
self.close() def start(self):
self.btnStart.hide()
self.bar.show()
self.tips.show()
self.line.hide()
self.btnQuit.setEnabled(False)
self.btnQuit.show()
self.downloadfile() def downloadfile(self):
self.bar.setValue(0)
path = '%s.zip' % self.mainfn
self.filesize = requests.get(self.fileuri, stream=True).headers['Content-Length']
self.fileobj = open(path, 'wb')
self.dfThread = dfThread(self.fileuri, self.filesize, self.fileobj, buffer=10240)
self.dfThread._signal.connect(self.progressinfo)
self.dfThread.start() def progressinfo(self, per, f_size_dl, f_size):
self.bar.setValue(per)
self.tips.setText('%s%%' % str(per))
self.info.setText('升级过程中请勿退出\n\n正在下载.. %s/%s bytes' % (str(f_size_dl), str(f_size)))
if per == 100:
self.info.setText('升级过程中请勿退出\n\n下载完成,正在安装..')
self.unzip('%s.zip' % self.mainfn)
self.tips.hide()
self.info.setText('安装完成\n\n已升级到最新版本')
self.btnQuit.setText('完成')
self.btnQuit.setEnabled(True) def unzip(self, fname):
z = zipFile(fname)
z.extract_to('.')
z.close()
os.remove(fname) if __name__ == '__main__':
app = QApplication(sys.argv)
frm = updateFrm()
#kill = subprocess.call(("taskkill /F /IM %s.exe" % frm.mainfn), shell=True)
sys.exit(app.exec_())
pyQt5不让进度条卡住的更多相关文章
- windows安装MongoDB进度条卡住,window安装mongo系统错误 2,系统错误5的解决办法(转载)
windows安装MongoDB进度条卡住,window安装mongo系统错误 2,系统错误5的解决办法 转自:https://www.cnblogs.com/sufferingStriver/p/m ...
- 安装.NET Framework进度条卡住不动的解决方案
VS在安装之前需要安装.NET Framework,我安装的是4.0版本.但是安装进度条到一半左右时就卡住不动了.前前后后重试多次,还有几次重新开机,但都没用. 开始还以为是安装的系统有问题.后来在网 ...
- pyqt5的简单进度条程序
# -*- coding: utf-8 -*- # @Author : FELIX # @Date : 2018/5/17 16:43 from PyQt5.QtCore import QBasicT ...
- 关于VMware vSphere Client安装时,.net framework4进度条卡住不动(亲测)
亲测有用的办法 1.点击电脑桌面右下角的"开始"按钮,点击"运行"按钮,在弹出的节目输入框中输入"regedit". 2.在弹出来的&quo ...
- ubuntu 14.04—解决软件中心进度条卡死的问题
软件中心下载安装软件进度条卡住了,这时候解决方法为: 先解锁: sudo rm -rf /var/lib/dpkg/lock 如果此时开启软件中心,发现进度还在, 那么我们需要找到相关的进程关闭他,使 ...
- R语言学习笔记:使用tcltk包显示进度条
一般在跑耗时较长的程序时,我们不知道程序到底有没有正常跑着,或者在爬虫的时候不知道爬到什么时候断了.因此可以添加进度条来显示当前进度,观察进度是否有进展.当进度条卡住的时候,可以判断程序断线,从而可以 ...
- [简短问答]lodop打印过慢或有进度条
问法1:打印预览显示进度条,过慢出现进度条,打印过慢,可能和很多原因有关:打印内容或样式或图片等过多,有需要下载有脚步执行或本身网络慢:机器性能过低 系统ie有问题或缓存过多:或使用的是共享打印机.如 ...
- python中pyqt5的进度条--python实战(十)
python太博大精深了,使用场景非常多.最近笔者一直使用PyQt5编一些小程序,顺便就把一些常用的东西列出来,做个记录和积累吧.进度条是非常常用的东西,今天用的时候,顺便温习了一下,这个东西自己感觉 ...
- (转)Unity3D游戏开发 NGUI之渐变加载到100%的Loading场景进度条
NGUI 现有的进度条存在的问题: 进度条跳跃式前进,加载到90%后卡住,突然进入下一个场景.接下来就是解决这个问题. 背景 通常游戏的主场景包含的资源较多,这会导致加载场景的时间较长.为了避免这个问 ...
随机推荐
- UVA - 11090 - Going in Cycle!!(二分+差分约束系统)
Problem UVA - 11090 - Going in Cycle!! Time Limit: 3000 mSec Problem Description You are given a we ...
- 为什么要花钱学 Python,自学不好吗?
买了这么多课程,有哪一门是你从头到尾听完,并且能将知识点学以致用的?如果你想成为一名相对优秀的程序员,建议你读完这篇文章,如果愿意可以分享给你的朋友. 2018过去的一年,对大多数互联网人来说,201 ...
- 用Case类生成模板代码
将类定义为case类会生成许多模板代码,好处在于: ①会生成一个apply方法,这样就可以不用new关键字创建新的实例. ②由于case类的构造函数参数默认是val,那么构造函数参数会自动生成访问方法 ...
- 高橋君とカード / Tak and Cards AtCoder - 2037 (DP)
Problem Statement Tak has N cards. On the i-th (1≤i≤N) card is written an integer xi. He is selectin ...
- 文件实时同步(rsync+inotify)
目标服务器:10.11.6.11 源服务器:10.11.6.12 准备条件: 1.关闭selinux: vi /etc/selinux/config #编辑防火墙配置文件 #SELINUX=enfor ...
- 'cordova' 不是内部或外部命令,也不是可运行的程序
问题: CMD 'cordova' 不是内部或外部命令,也不是可运行的程序: 解决:配置环境变量 1.找到npm的安装路径 :如C:\Users\AppData\Roaming\npm 2.环境 ...
- hdu4843(NOI2000) 古城之谜 (trie树+DP)
Description 著名的考古学家石教授在云梦高原上发现了一处古代城市遗址.让教授欣喜的是在这个他称为冰峰城(Ice-Peak City)的城市中有12块巨大石碑,上面刻着用某种文字书写的资料,他 ...
- 使用Docker安装Oracle数据库
在很多时候,我们需要在本地安装Oracle数据库,但是整个安装的过程时间非常长而且安装文件大,那么有不有更好的办法来安装Oracle数据库既能减少安装的时间而且还能够快速进行部署呢?答案就是使用Doc ...
- sql server查看表是否死锁
1,查看那个表死锁 select object_name(resource_associated_entity_id) as tableName, request_session_id as pid ...
- TsinsenA1489 抽奖 【期望】
题目分析: 问题可以转化成将m个球放进n个盒子里,每个盒子的贡献为盒子中球数的平方. 第一问考虑增量. 对于一个原本有$x$个球的盒子,新加一个球的贡献是$2x+1$.期望条件下仍然满足. 第$i$个 ...