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的subprocess模块总结
Nov 07 Python
用Python编写一个基于终端的实现翻译的脚本
Apr 24 Python
用ReactJS和Python的Flask框架编写留言板的代码示例
Dec 19 Python
深入解析Python中的线程同步方法
Jun 14 Python
django开发教程之利用缓存文件进行页面缓存的方法
Nov 10 Python
对命令行模式与python交互模式介绍
May 12 Python
python使用参数对嵌套字典进行取值的方法
Apr 26 Python
对django layer弹窗组件的使用详解
Aug 31 Python
python pyinstaller打包exe报错的解决方法
Nov 02 Python
关于Pytorch MaxUnpool2d中size操作方式
Jan 03 Python
python Selenium 库的使用技巧
Oct 16 Python
Pytorch 中的optimizer使用说明
Mar 03 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漏洞小结
2012/02/05 PHP
linux命令之调试工具strace的深入分析
2013/06/03 PHP
php获取目录所有文件并将结果保存到数组(实例)
2013/10/25 PHP
yii2 在控制器中验证请求参数的使用方法
2019/06/19 PHP
(function($){...})(jQuery)的意思
2010/07/22 Javascript
疯狂Jquery第一天(Jquery学习笔记)
2012/05/11 Javascript
node.js [superAgent] 请求使用示例
2015/03/13 Javascript
原生JavaScript编写俄罗斯方块
2015/03/30 Javascript
JS实现简单的键盘打字的效果
2015/04/24 Javascript
jQuery实现的省市联动菜单功能示例【测试可用】
2017/01/13 Javascript
jQuery插件HighCharts绘制2D柱状图、折线图的组合双轴图效果示例【附demo源码下载】
2017/03/09 Javascript
网页中的图片查看器viewjs使用方法
2017/07/11 Javascript
angular $watch 一个变量的变化(实例讲解)
2017/08/02 Javascript
小程序关于请求同步的总结
2019/05/05 Javascript
使用flow来规范javascript的变量类型
2019/09/12 Javascript
如何实现js拖拽效果及原理解析
2020/05/08 Javascript
vue和小程序项目中使用iconfont的方法
2020/05/19 Javascript
python中的多线程实例教程
2014/08/27 Python
Python的Django框架中的表单处理示例
2015/07/17 Python
5种Python单例模式的实现方式
2016/01/14 Python
Tesserocr库的正确安装方式
2018/10/19 Python
pygame游戏之旅 如何制作游戏障碍
2018/11/20 Python
Python实现的文轩网爬虫完整示例
2019/05/16 Python
简单了解python代码优化小技巧
2019/07/08 Python
Python学习笔记之列表和成员运算符及列表相关方法详解
2019/08/22 Python
python将三维数组展开成二维数组的实现
2019/11/30 Python
从0到1使用python开发一个半自动答题小程序的实现
2020/05/12 Python
解决django 向mysql中写入中文字符出错的问题
2020/05/18 Python
如何基于python实现年会抽奖工具
2020/10/20 Python
PyQT5速成教程之Qt Designer介绍与入门
2020/11/02 Python
Pytorch模型迁移和迁移学习,导入部分模型参数的操作
2021/03/03 Python
C#笔试题
2015/07/14 面试题
do you have any Best Practice for testing
2016/06/04 面试题
教你用Java Swing实现自助取款机系统
2021/06/11 Java/Android
javascript拖曳互换div的位置实现示例
2021/06/28 Javascript
Python 恐龙跑跑小游戏实现流程
2022/02/15 Python