PyQt5实现下载进度条效果
作者:口嫌体正直 发布时间:2022-06-17 10:47:11
标签:PyQt5,进度条
起因是因为公司要开发一款自动登录某网站的助手工具提供给客户使用,要使用到selenium,所以选择了pyqt5的方式来开发这个C/S架构的客户端
在过程中要用到自动更新的功能,所以自己写一个下载进度的插件给大家分享,本人编程水平有点菜,不要见怪。
界面文件UI_download.py
# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import Qt
class Ui_download(object):
def setupUi(self, Dialog):
Dialog.setWindowFlags(Qt.FramelessWindowHint)
Dialog.setObjectName("Dialog")
Dialog.resize(300, 56)
Dialog.setFixedSize(Dialog.width(), Dialog.height())
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(Dialog.sizePolicy().hasHeightForWidth())
Dialog.setSizePolicy(sizePolicy)
Dialog.setSizeGripEnabled(True)
self.gridLayout = QtWidgets.QGridLayout(Dialog)
self.gridLayout.setSizeConstraint(QtWidgets.QLayout.SetDefaultConstraint)
self.gridLayout.setObjectName("gridLayout")
self.progressBar = QtWidgets.QProgressBar(Dialog)
self.progressBar.setProperty("value", 0)
self.progressBar.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
self.progressBar.setObjectName("progressBar")
self.gridLayout.addWidget(self.progressBar, 1, 0, 1, 1)
self.label = QtWidgets.QLabel(Dialog)
self.label.setObjectName("label")
self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
self.retranslateUi(Dialog)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
self.label.setText(_translate("Dialog", "客户端更新下载中..."))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
Dialog = QtWidgets.QDialog()
ui = Ui_download()
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
实现文件download.py
# -*- coding: utf-8 -*-
"""
Module implementing Dialog.
"""
from PyQt5.QtCore import QThread, pyqtSignal
from PyQt5.QtWidgets import QDialog
from PyQt5 import QtWidgets
from Ui_download import Ui_download
import os
import sys
import requests
class downloadThread(QThread):
download_proess_signal = pyqtSignal(int)
def __init__(self, download_url, filesize, fileobj, buffer):
super(downloadThread, self).__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.download_proess_signal.emit(int(proess))
self.fileobj.close()
self.exit(0)
except Exception as e:
print(e)
class download(QDialog, Ui_download):
"""
下载类实现
"""
def __init__(self, download_url, auto_close=True, parent=None):
"""
Constructor
@download_url:下载地址
@auto_close:下载完成后时候是否需要自动关闭
"""
super(download, self).__init__(parent)
self.setupUi(self)
self.progressBar.setValue(0)
self.downloadThread = None
self.download_url = download_url
self.filesize = None
self.fileobj = None
self.auto_close = auto_close
self.download()
def download(self):
self.filesize = requests.get(self.download_url, stream=True).headers['Content-Length']
path = os.path.join("update", os.path.basename(self.download_url))
self.fileobj = open(path, 'wb')
self.downloadThread = downloadThread(self.download_url, self.filesize, self.fileobj, buffer=10240)
self.downloadThread.download_proess_signal.connect(self.change_progressbar_value)
self.downloadThread.start()
def change_progressbar_value(self, value):
self.progressBar.setValue(value)
if self.auto_close and value == 100:
self.close()
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
ui = download()
ui.show()
sys.exit(app.exec_())
比较通用的一个下载模块,初始化调用的时候只需要传入要下载的地址就行,下载操作采取异步,以防阻塞UI,确保程序目录下拥有update目录存在,默认我是将要更新的文件放在这个目录下面,还有优化的地方希望大家可以指出。
运行后效果:
来源:https://blog.csdn.net/rain_of_mind/article/details/79989715


猜你喜欢
- 地图 API Map() 构造器实例创建一个 Google 地图:<html><head><scriptsrc
- 1.查询当前数据库所有表SELECT O.object_id AS TableId, &nb
- 本文实例讲述了JS实现获取毫秒值及转换成年月日时分秒的方法。分享给大家供大家参考,具体如下:时间日期对象创建方式一var date=new
- zip()的作用先看一下语法:zip(iter1 [,iter2 [...]]) —> zip objectPython的内置help
- 一、Django中路由的作用URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间
- 1、检测登录状态base.pydef checkLogin(func):""" 查看session
- 一、定义新的自动求导函数在底层,每个原始的自动求导运算实际上是两个在Tensor上运行的函数。其中,forward函数计算从输入Tensor
- 如下所示:matplotlib subplots 设置总图的标题 :fig.suptitle(dname,fontsize=16,x=0.5
- 1.首先注册应用,获取 appkey、appsecretapi_url = "https://oapi.dingtalk.com/
- 本文探讨了提高MySQL数据库性能的思路,并从8个方面给出了具体的解决方法。1、选取最适用的字段属性MySQL可以很好的支持大数据量的存取,
- 前言OpenCV是图像处理常用的库,作为初学者,往往从图片的读取、保存、查询图片的信息开始,下面将分享Python下OpenCV的一些基本使
- 通过学习ASP明明白白你的If语句流程。If condition Then [statements1]E
- 同时装配两个相同类型数据库1.配置文件:spring: profiles: active: devda
- 写在前面最近在使用Mockjs作为项目里面mock数据的工具,发现mockjs做的拦截部分是自己实现摸拟了一个XMLHttpRequest的
- 废话不多说,直接上代码!updateBody = { "query":{ &nb
- 区别:series,只是一个一维数据结构,它由index和value组成。dataframe,是一个二维结构,除了拥有index和value
- 以下方案皆为引用,仅供参考。方案一:1.先声明一下,这种解决方法适用于任何版本的永久破解启动不了的情况(包括:2019版本的)2.下面直接切
- 我们在工作中时常会遇到一些客户的TPS\QPS都不太高,但磁盘占用非常大,一旦单实例空间太大,像内存、网络、CPU以及备份都将增加相应的开销
- 关键路径计算是项目管理中关于进度管理的基本计算。 但是对于绝大多数同学来说, 关键路径计算都只是对一些简单情形的计算。今天,田老师根据以往的
- 本文详细讲述了DRF认证组件的原理以及用法.源码剖析讲解DRF版本的时候我们都知道了,在dispatch方法里执行了initial方法来初始