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中的进程分支fork和exec详解
Apr 11 Python
Python的shutil模块中文件的复制操作函数详解
Jul 05 Python
Python结巴中文分词工具使用过程中遇到的问题及解决方法
Apr 15 Python
Python实现SSH远程登陆,并执行命令的方法(分享)
May 08 Python
利用python实现简单的循环购物车功能示例代码
Jul 05 Python
Python基于辗转相除法求解最大公约数的方法示例
Apr 04 Python
django多对多表的创建,级联删除及手动创建第三张表
Jul 25 Python
python Django 创建应用过程图示详解
Jul 29 Python
pytorch 图像预处理之减去均值,除以方差的实例
Jan 02 Python
pytorch判断是否cuda 判断变量类型方式
Jun 23 Python
使用Python获取爱奇艺电视剧弹幕数据的示例代码
Jan 12 Python
Python如何解决secure_filename对中文不支持问题
Jul 16 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怎样调用MSSQL的存储过程
2006/10/09 PHP
PHP的explode和implode的使用说明
2011/07/17 PHP
PHP大神的十大优良习惯
2016/09/14 PHP
脚本吧 - 幻宇工作室用到js,超强推荐share.js
2006/12/23 Javascript
js Flash插入函数免激活代码
2009/03/31 Javascript
jQuery 鼠标经过(hover)事件的延时处理示例
2014/04/14 Javascript
在父页面得到zTree已选中的节点的方法
2015/02/12 Javascript
RequireJS入门一之实现第一个例子
2015/09/30 Javascript
JavaScript编写带旋转+线条干扰的验证码脚本实例
2016/05/30 Javascript
AngularJS基础 ng-copy 指令实例代码
2016/08/01 Javascript
jQuery中JSONP的两种实现方式详解
2016/09/26 Javascript
js上下视差滚动简单实现代码
2017/03/07 Javascript
JavaScript实现审核流程状态的动态显示进度条
2017/03/15 Javascript
深入理解AngularJS中的ng-bind-html指令
2017/03/27 Javascript
bootstrap table支持高度百分比的实例代码
2018/02/28 Javascript
浅谈Express.js解析Post数据类型的正确姿势
2019/05/30 Javascript
vue 单页应用和多页应用的优劣
2020/10/22 Javascript
Python深入学习之特殊方法与多范式
2014/08/31 Python
python通过装饰器检查函数参数数据类型的方法
2015/03/13 Python
Python制作简易注册登录系统
2016/12/15 Python
Python实现合并两个列表的方法分析
2018/05/28 Python
python协程之动态添加任务的方法
2019/02/19 Python
Python使用paramiko操作linux的方法讲解
2019/02/25 Python
解决Keras的自定义lambda层去reshape张量时model保存出错问题
2020/07/01 Python
Python+Kepler.gl实现时间轮播地图过程解析
2020/07/20 Python
Python自动巡检H3C交换机实现过程解析
2020/08/14 Python
突袭HTML5之Javascript API扩展1—Web Worker异步执行及相关概述
2013/01/31 HTML / CSS
学生会招新策划书
2014/02/14 职场文书
2014年两会学习心得体会
2014/03/17 职场文书
贷款担保书范文
2014/05/13 职场文书
党的群众路线教育实践活动总结报告
2014/07/03 职场文书
新闻编辑求职信
2014/07/13 职场文书
室内趣味活动方案
2014/08/24 职场文书
2014年办公室主任工作总结
2014/11/12 职场文书
2015年民兵整组工作总结
2015/07/24 职场文书
导游词之黄帝陵景区
2019/09/16 职场文书