pyQt5不让进度条卡住

时间:2022-09-18 11:59:48

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

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

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

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

  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. 7月17日——高校就业信息网站功能及数据获取之python爬虫

    本周我们小组在分析上周用户需求之后,确定了网站的主要框架和功能.数据收集和存储方式,以及项目任务分配. 一.网站的主要框架和功能. 网站近期将要实现的主要功能有,先重点收集高校(华东五校)就业宣讲会的 ...

  2. 30天C#基础巩固----Lambda表达式

         这几天有点不在状态,每一次自己很想认真的学习,写点东西的时候都会被各种小事情耽误,执行力太差.所以自己反思了下最近的学习情况,对于基础的知识,可以从书中和视频中学习到,自己还是需要注意下关于 ...

  3. jquery实现点击上移到顶部功能(转)

    ---恢复内容开始--- 本文转载自W3CPLUS, jQuery制作go to top按钮 每每看到网友Blog的页面底部或中间有一个按钮回到页面顶部,羡慕死人了,但自己就是做不出这样的效果.后来在 ...

  4. SlimDX.dll安装之后所在位置

    C:\Windows\Microsoft.NET\assembly\GAC_64\SlimDX\v4.0_4.0.13.43__b1b0c32fd1ffe4f9\SlimDX.dll

  5. C#多线程交替赋值取值

    static AutoResetEvent auto=new AutoResetEvent(false); ; ; static void Main() { Thread th1 = new Thre ...

  6. Linux学习之路:变量值的删除、替代和替换

    一.删除 var为变量名, ${var#v*r}:从左到右匹配将:头部是“v”,尾部是“r”的最短的部分删除 ${var##v*r}:从左到右匹配将:头部是“v”,尾部是“r”的最长的部分删除 ${v ...

  7. request.getAttribute( "result");和request.setAttribute("result",username);

    request.setAttribute("result",username);在request对象中加入名为result的属性并附值为username,因为request对象是可 ...

  8. HDU ACM 1290 献给杭电五十周年校庆的礼物

    解析: 1.n条直线把平面切割成的区域数为: f(n)=f(n-1)+n=n(n+1)/2+1; 2.把空间切割为最多区域数的时候,第n个平面与前(n-1)个平面相交.且无三面共线,因此该平面与前(n ...

  9. TP内部方法访问

    TP定义控制器之后,访问定义的方法: <?php namespace app\index\controller; use think\Controller; class Index extend ...

  10. FastJSON基础

    对象的类型 json文本 json数组 json对象 java对象 类型的转换 json文本      转   json对象      JSON.parseObject(str) json文本     ...