PyQt5实现下载进度条效果


Posted in Python onApril 19, 2018

起因是因为公司要开发一款自动登录某网站的助手工具提供给客户使用,要使用到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目录存在,默认我是将要更新的文件放在这个目录下面,还有优化的地方希望大家可以指出。

运行后效果:

PyQt5实现下载进度条效果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
深入解析Python编程中JSON模块的使用
Oct 15 Python
举例讲解Python设计模式编程中的访问者与观察者模式
Jan 26 Python
Python引用模块和查找模块路径
Mar 17 Python
详解Python命令行解析工具Argparse
Apr 20 Python
Python for循环生成列表的实例
Jun 15 Python
python实现自动网页截图并裁剪图片
Jul 30 Python
python,Django实现的淘宝客登录功能示例
Jun 12 Python
python 实现12bit灰度图像映射到8bit显示的方法
Jul 08 Python
Python接口自动化判断元素原理解析
Feb 24 Python
Python龙贝格法求积分实例
Feb 29 Python
python函数调用,循环,列表复制实例
May 03 Python
Python 字节流,字符串,十六进制相互转换实例(binascii,bytes)
May 11 Python
解决python 输出是省略号的问题
Apr 19 #Python
python 多维切片之冒号和三个点的用法介绍
Apr 19 #Python
对Python中range()函数和list的比较
Apr 19 #Python
使用python读取txt文件的内容,并删除重复的行数方法
Apr 18 #Python
python对excel文档去重及求和的实例
Apr 18 #Python
Pandas之drop_duplicates:去除重复项方法
Apr 18 #Python
pandas 实现将重复表格去重,并重新转换为表格的方法
Apr 18 #Python
You might like
用PHP制作静态网站的模板框架(一)
2006/10/09 PHP
PHP读取文件内容后清空文件示例代码
2014/03/18 PHP
Thinkphp5框架简单实现钩子(Hook)行为的方法示例
2019/09/03 PHP
JavaScript Event学习第六章 事件的访问
2010/02/07 Javascript
Jquery Ajax学习实例6 向WebService发出请求,返回DataSet(XML) 异步调用
2010/03/18 Javascript
删除节点的jquery代码
2014/01/13 Javascript
jquery.post用法之type设置问题
2014/02/24 Javascript
javascript实现俄罗斯方块游戏的思路和方法
2015/04/27 Javascript
js验证身份证号有效性并提示对应信息
2015/10/19 Javascript
基于jquery实现智能表单验证操作
2016/05/09 Javascript
JavaScript的Vue.js库入门学习教程
2016/05/23 Javascript
详解Vue.js动态绑定class
2016/12/20 Javascript
使用jquery给新生的th绑定hover事件的实例
2017/02/10 Javascript
微信小程序页面间通信的5种方式
2017/03/31 Javascript
Javascript ES6中数据类型Symbol的使用详解
2017/05/02 Javascript
vue的状态管理模式vuex
2017/11/30 Javascript
详解为生产环境编译Angular2应用的方法
2018/12/10 Javascript
vue实现数字滚动效果
2020/06/29 Javascript
JS自定义右键菜单实现代码解析
2020/07/16 Javascript
Python批量转换文件编码格式
2015/05/17 Python
实例讲解Python中函数的调用与定义
2016/03/14 Python
用xpath获取指定标签下的所有text的实例
2019/01/02 Python
对Python捕获控制台输出流的方法详解
2019/01/07 Python
python基于pdfminer库提取pdf文字代码实例
2019/08/15 Python
Python 实现一行输入多个数字(用空格隔开)
2020/04/29 Python
Softmax函数原理及Python实现过程解析
2020/05/22 Python
Python识别处理照片中的条形码
2020/11/16 Python
HTML5新增的8类INPUT输入类型介绍
2015/07/06 HTML / CSS
Microsoft新加坡官方网站:购买微软最新软件和技术产品
2016/10/28 全球购物
ASOS英国官网:英国在线时装和化妆品零售商
2017/05/19 全球购物
澳大利亚和新西兰最大的在线旅行社之一:Aunt Betty
2019/08/07 全球购物
数学系毕业生的自我评价
2014/01/10 职场文书
2014领导干部学习焦裕禄同志先进事迹思想汇报
2014/09/19 职场文书
如何用JavaScipt测网速
2021/05/09 Javascript
Pytorch GPU内存占用很高,但是利用率很低如何解决
2021/06/01 Python
vue组件冲突之引用另一个组件出现组件不显示的问题
2022/04/13 Vue.js