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 生成不重复的随机数的代码
May 15 Python
Python使用django获取用户IP地址的方法
May 11 Python
python在Windows下安装setuptools(easy_install工具)步骤详解
Jul 01 Python
matplotlib.pyplot画图 图片的二进制流的获取方法
May 24 Python
对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解
Jun 28 Python
Python实现快速傅里叶变换的方法(FFT)
Jul 21 Python
Django在admin后台集成TinyMCE富文本编辑器的例子
Aug 09 Python
python多线程同步实例教程
Aug 11 Python
pytorch中的embedding词向量的使用方法
Aug 18 Python
树莓派安装OpenCV3完整过程的实现
Oct 10 Python
浅谈Python中的正则表达式
Jun 28 Python
在NumPy中深拷贝和浅拷贝相关操作的定义和背后的原理
Apr 14 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 格式化数字的时候注意数字的范围
2010/04/13 PHP
常见的PHP五种设计模式小结
2011/03/23 PHP
php使用filter过滤器验证邮箱 ipv6地址 url验证
2013/12/25 PHP
多广告投放代码 推荐
2006/11/13 Javascript
表单提交前触发函数返回true表单才会提交
2014/03/11 Javascript
JQuery动画animate的stop方法使用详解
2014/05/09 Javascript
js实现点击向下展开的下拉菜单效果代码
2015/09/01 Javascript
BootStrap modal模态弹窗使用小结
2016/10/26 Javascript
浅谈ES6 模板字符串的具体使用方法
2017/11/07 Javascript
vue中的计算属性的使用和vue实例的方法示例
2017/12/04 Javascript
react 父子组件之间通讯props
2018/09/08 Javascript
React实现全局组件的Toast轻提示效果
2018/09/21 Javascript
vue地址栏直接输入路由无效问题的解决
2018/11/15 Javascript
javascript中floor使用方法总结
2019/02/02 Javascript
js中arguments对象的深入理解
2019/05/14 Javascript
vue模块移动组件的实现示例
2020/05/20 Javascript
python re模块findall()函数实例解析
2018/01/19 Python
PyQt5 QTableView设置某一列不可编辑的方法
2019/06/25 Python
Pandas 解决dataframe的一列进行向下顺移问题
2019/12/27 Python
python3 循环读取excel文件并写入json操作
2020/07/14 Python
英国网上超市:Ocado
2020/03/05 全球购物
新学期红领巾广播稿
2014/01/14 职场文书
妈妈的账单教学反思
2014/02/06 职场文书
廉洁使者实施方案
2014/03/29 职场文书
个人授权委托书
2014/04/03 职场文书
法人代表授权委托书
2014/04/08 职场文书
党员十八大心得体会
2014/09/12 职场文书
2015年上半年党建工作总结
2015/03/30 职场文书
2015年端午节活动方案
2015/05/05 职场文书
讲座新闻稿
2015/07/18 职场文书
2015年环卫处个人工作总结
2015/07/27 职场文书
高中班长竞选稿
2015/11/20 职场文书
委托开发合同书(标准版)
2019/08/07 职场文书
使用Java去实现超市会员管理系统
2022/03/18 Java/Android
如何通过简单的代码描述Angular父组件、子组件传值
2022/04/07 Javascript
Win11 22H2 2022怎么更新? 获得Win1122H22022版本升级技巧
2022/09/23 数码科技