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中文乱码的解决方法
Nov 04 Python
python抽象基类用法实例分析
Jun 04 Python
总结Python编程中函数的使用要点
Mar 20 Python
Jupyter安装nbextensions,启动提示没有nbextensions库
Apr 23 Python
用python生成1000个txt文件的方法
Oct 25 Python
解决django后台样式丢失,css资源加载失败的问题
Jun 11 Python
如何使用python实现模拟鼠标点击
Jan 06 Python
详解Python 实现 ZeroMQ 的三种基本工作模式
Mar 24 Python
Python Django中的STATIC_URL 设置和使用方式
Mar 27 Python
Django 5种类型Session使用方法解析
Apr 29 Python
详解Django ORM引发的数据库N+1性能问题
Oct 12 Python
python查询MySQL将数据写入Excel
Oct 29 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
PHP4 与 MySQL 数据库操作函数详解
2006/10/09 PHP
PHP eval函数使用介绍
2013/12/08 PHP
php输出1000以内质数(素数)示例
2014/02/16 PHP
windows下配置apache+php+mysql时出现问题的处理方法
2014/06/20 PHP
js一组验证函数
2008/12/20 Javascript
javascript与CSS复习(二)
2010/06/29 Javascript
javascript实现json页面分页实例代码
2014/02/20 Javascript
javascript结合canvas实现图片旋转效果
2015/05/03 Javascript
javascript实现简单的省市区三级联动
2015/05/14 Javascript
JavaScript中的Math.LOG2E属性使用详解
2015/06/14 Javascript
全面详细的jQuery常见开发技巧手册
2016/02/21 Javascript
jQuery基础知识点总结(必看)
2016/05/31 Javascript
JavaScript中定时控制Throttle、Debounce和Immediate详解
2016/11/17 Javascript
详解AngularJS中$filter过滤器使用(自定义过滤器)
2017/02/04 Javascript
bootstrap table表格插件使用详解
2017/05/08 Javascript
JavaScript设置名字输入不合法的实现方法
2017/05/23 Javascript
激动人心的 Angular HttpClient的源码解析
2017/07/10 Javascript
JavaScript变量类型以及变量作用域详解
2017/08/14 Javascript
JavaScript面试出现频繁的一些易错点整理
2018/03/29 Javascript
vue.js项目nginx部署教程
2018/04/05 Javascript
微信小程序日历组件使用方法详解
2018/12/29 Javascript
微信小程序单选radio及多选checkbox按钮用法示例
2019/04/30 Javascript
微信小程序里引入SVG矢量图标的方法
2019/09/20 Javascript
通过实例解析vuejs如何实现调试代码
2020/07/16 Javascript
解决vue watch数据的方法被调用了两次的问题
2020/11/07 Javascript
[02:41]2015国际邀请赛中国区预选赛观战指南
2015/05/20 DOTA
使用Python编写爬虫的基本模块及框架使用指南
2016/01/20 Python
Python注释详解
2016/06/01 Python
Python中shape计算矩阵的方法示例
2017/04/21 Python
解决安装python库时windows error5 报错的问题
2018/10/21 Python
对Python中TKinter模块中的Label组件实例详解
2019/06/14 Python
简单了解python反射机制的一些知识
2019/07/13 Python
Python 共享变量加锁、释放详解
2019/08/28 Python
邹越演讲观后感
2015/06/15 职场文书
sqlserver2017共享功能目录路径不可改的解决方法
2021/04/16 SQL Server
python代码实现备忘录案例讲解
2021/07/26 Python