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%后卡住,突然进入下一个场景.接下来就是解决这个问题. 背景 通常游戏的主场景包含的资源较多,这会导致加载场景的时间较长.为了避免这个问 ...
随机推荐
- redis 的过期策略都有哪些?内存淘汰机制都有哪些?
面试题 redis 的过期策略都有哪些?内存淘汰机制都有哪些?手写一下 LRU 代码实现? 面试官心理分析 如果你连这个问题都不知道,上来就懵了,回答不出来,那线上你写代码的时候,想当然的认为写进 r ...
- 三十六、fetch
https://developer.mozilla.org/zh-CN/docs/Web/API/Fetch_API
- Java规则之条件语句中做空判断时使用||和&&常犯的错误
错误代码示例: public String bar(String string) { //error 1 if (string!=null || !string.equals("" ...
- Centos6.5-DHCPServer安装
1.查询dhcp有没有被安装,如下没有被安装 [zfp@localhost ~]$ rpm -q dhcppackage dhcp is not installed[zfp@localhost ~]$ ...
- html中滚动小球的demo
类似于下图的效果: 代码: <!DOCTYPE html> <html> <head> <title>Promise animation</tit ...
- tensorflow-TFRecord报错ValueError: Protocol message Feature has no "feature" field.
编写代码用TFRecord数据结构存储数据集信息是报错:ValueError: Protocol message Feature has no "feature" field.或和 ...
- shutil、zipfile,tarfile
shutil 模块提供了大量的文件的高级操作.特别针对文件拷贝和删除,主要功能为目录和文件操作以及压缩操作. 1. shutil.copyfileobj(fsrc, fdst[, length]) 功 ...
- Spring框架的@Valid注解
上一篇文章介绍了springmvc的get请求参数可以是一个自定的对象.那么如何限制这个对象里的参数是否必传呢? 方法一:在代码逻辑里取出对象里的这个值,手动进行判断 方法二:使用@Valid注解,在 ...
- 命令行中的python一行流
优点是比那些古怪的脚本要易读 python -c 'import os, sys; [os.rename(a, a[0].upper()+a[1:]) for a in sys.argv[1:]]' ...
- mac 下 clang++ 找不到头文件 stdlib.h
因为要用 openmp库,用 clang++ 编译 c++程序,出现了如下报错: clang++ xx.cpp -o xx -fopenmp /usr/local/Cellar/llvm/7.0.0/ ...