这里我们用一个更新程序做示例, 下载文件的过程中让进度条实时显示下载进度。

如果下载和更新进度条的工作都放在一个线程中,会出现进度条卡顿的情况。

正确的做法是把界面刷新和工作任务交给不同的线程去运行,然后用信号同步。

# _*_  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不让进度条卡住的更多相关文章

  1. windows安装MongoDB进度条卡住,window安装mongo系统错误 2,系统错误5的解决办法(转载)

    windows安装MongoDB进度条卡住,window安装mongo系统错误 2,系统错误5的解决办法 转自:https://www.cnblogs.com/sufferingStriver/p/m ...

  2. 安装.NET Framework进度条卡住不动的解决方案

    VS在安装之前需要安装.NET Framework,我安装的是4.0版本.但是安装进度条到一半左右时就卡住不动了.前前后后重试多次,还有几次重新开机,但都没用. 开始还以为是安装的系统有问题.后来在网 ...

  3. pyqt5的简单进度条程序

    # -*- coding: utf-8 -*- # @Author : FELIX # @Date : 2018/5/17 16:43 from PyQt5.QtCore import QBasicT ...

  4. 关于VMware vSphere Client安装时,.net framework4进度条卡住不动(亲测)

    亲测有用的办法 1.点击电脑桌面右下角的"开始"按钮,点击"运行"按钮,在弹出的节目输入框中输入"regedit". 2.在弹出来的&quo ...

  5. ubuntu 14.04—解决软件中心进度条卡死的问题

    软件中心下载安装软件进度条卡住了,这时候解决方法为: 先解锁: sudo rm -rf /var/lib/dpkg/lock 如果此时开启软件中心,发现进度还在, 那么我们需要找到相关的进程关闭他,使 ...

  6. R语言学习笔记:使用tcltk包显示进度条

    一般在跑耗时较长的程序时,我们不知道程序到底有没有正常跑着,或者在爬虫的时候不知道爬到什么时候断了.因此可以添加进度条来显示当前进度,观察进度是否有进展.当进度条卡住的时候,可以判断程序断线,从而可以 ...

  7. [简短问答]lodop打印过慢或有进度条

    问法1:打印预览显示进度条,过慢出现进度条,打印过慢,可能和很多原因有关:打印内容或样式或图片等过多,有需要下载有脚步执行或本身网络慢:机器性能过低 系统ie有问题或缓存过多:或使用的是共享打印机.如 ...

  8. python中pyqt5的进度条--python实战(十)

    python太博大精深了,使用场景非常多.最近笔者一直使用PyQt5编一些小程序,顺便就把一些常用的东西列出来,做个记录和积累吧.进度条是非常常用的东西,今天用的时候,顺便温习了一下,这个东西自己感觉 ...

  9. (转)Unity3D游戏开发 NGUI之渐变加载到100%的Loading场景进度条

    NGUI 现有的进度条存在的问题: 进度条跳跃式前进,加载到90%后卡住,突然进入下一个场景.接下来就是解决这个问题. 背景 通常游戏的主场景包含的资源较多,这会导致加载场景的时间较长.为了避免这个问 ...

随机推荐

  1. [LeetCode] 21. 合并两个有序链表

    题目链接:https://leetcode-cn.com/problems/merge-two-sorted-lists/ 题目描述: 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定 ...

  2. JQuery:怎么动态切换一个元素的显示、隐藏呢?原来隐藏就显示,原来显示就隐藏

    使用toggle() 方法:<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"& ...

  3. HTTP对静态资源的优化

    HTTP的If-Modified-Since和Modified-Since标签 在第一次请求静态资源时响应头会携带一个Modified-Since标签,里面存放的是静态资源的最后修改时间,在之后对该静 ...

  4. 将WTL应用向导添加到VS2019

    WTL 简介 WTL 全称是 Windows Template Library,像 MFC 一样使用 C++ 的面向对象技术对 Win32 接口进行了封装,使之便于开发 Windows 程序.相对于 ...

  5. Python scrapy爬虫数据保存到MySQL数据库

    除将爬取到的信息写入文件中之外,程序也可通过修改 Pipeline 文件将数据保存到数据库中.为了使用数据库来保存爬取到的信息,在 MySQL 的 python 数据库中执行如下 SQL 语句来创建 ...

  6. [蓝桥杯]2016蓝桥省赛B组题目及详解

    /*——————————————————————————————————————————————————————————— [结果填空题]T1 (分值:3) 题目:煤球数目 有一堆煤球,堆成三角棱锥形 ...

  7. laravel 预加载特定的列

    /**订单列表 0 已删除 1执行中 2 已过期 * * @param Request $request * * @return \Illuminate\Contracts\View\Factory| ...

  8. javascript深入浅出——学习笔记(包装对象和类型检测)

    3包装对象:https://www.imooc.com/video/5676 当我们尝试把基本类型已对象的方式访问时,javascript会把该基本类型转换为对应的包装类型对象(临时对象),相当于ne ...

  9. C#给字符串赋予字面值——字符串插入、转义序列的使用

    1.占位符.字符串插入 给字符串赋予字面值时,经常遇见在字符串中包含变量的情况,用连接符进行拼接.转换的方式比较麻烦.还容易出错.C#提供了较为便捷的处理方式,即‘占位符’,以及C#6的新功能‘插入字 ...

  10. DS博客作业02--线性表

    1.本周学习总结 1.1思维导图 1.2.谈谈你对线性表的认识及学习体会 这阶段学习学的是线性表,学习线性表的两种存储顺序-----链表和顺序表,体会了两者存储结构之间的区别,通过对顺序表,单链表,双 ...