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递归计算N!的方法
May 05 Python
Python使用smtplib模块发送电子邮件的流程详解
Jun 27 Python
python的构建工具setup.py的方法使用示例
Oct 23 Python
Python实现的连接mssql数据库操作示例
Aug 17 Python
Python简易版停车管理系统
Aug 12 Python
python接口调用已训练好的caffe模型测试分类方法
Aug 26 Python
Flask框架 CSRF 保护实现方法详解
Oct 30 Python
Python 模拟生成动态产生验证码图片的方法
Feb 01 Python
Python图像处理库PIL中图像格式转换的实现
Feb 26 Python
Selenium向iframe富文本框输入内容过程图解
Apr 10 Python
Python常用库Numpy进行矩阵运算详解
Jul 21 Python
用Python实现定时备份Mongodb数据并上传到FTP服务器
Jan 27 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
全国FM电台频率大全 - 17 湖北省
2020/03/11 无线电
php5.3以后的版本连接sqlserver2000的方法
2014/07/28 PHP
laravel 字段格式化 modle 字段类型转换方法
2019/09/30 PHP
javascript 屏蔽鼠标键盘的几段代码
2008/01/02 Javascript
Javascript解决常见浏览器兼容问题的12种方法
2010/01/04 Javascript
javascript Array对象基础知识小结
2010/11/16 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(五)可移动地图的实现
2013/01/23 Javascript
JS创建自定义表格具体实现
2014/02/11 Javascript
使用jquery实现以post打开新窗口
2014/03/19 Javascript
JavaScript中对象property的读取和写入方法介绍
2014/12/30 Javascript
Javascript 拖拽的一些高级的应用(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
jquery ztree实现树的搜索功能
2016/02/25 Javascript
Bootstrap每天必学之响应式导航、轮播图
2016/04/25 Javascript
jQuery中DOM节点的删除方法总结(超全面)
2017/01/22 Javascript
javaScript封装的各种写法
2017/08/14 Javascript
vue绑定的点击事件阻止冒泡的实例
2018/02/08 Javascript
node.js的Express服务器基本使用教程
2019/01/09 Javascript
layui switch 开关监听 弹出确定状态转换的例子
2019/09/21 Javascript
vue实现禁止浏览器记住密码功能的示例代码
2021/02/03 Vue.js
[01:07]DOTA2次级职业联赛 - Fpb战队宣传片
2014/12/01 DOTA
Python压缩和解压缩zip文件
2015/02/14 Python
Python使用正则表达式过滤或替换HTML标签的方法详解
2017/09/25 Python
基于Python和Scikit-Learn的机器学习探索
2017/10/16 Python
python中的字典操作及字典函数
2018/01/03 Python
bluepy 一款python封装的BLE利器简单介绍
2019/06/25 Python
Python装饰器使用你可能不知道的几种姿势
2019/10/25 Python
Python面向对象中类(class)的简单理解与用法分析
2020/02/21 Python
python和php学习哪个更有发展
2020/06/17 Python
如何在python中处理配置文件代码实例
2020/09/27 Python
单身旅行者的单身假期:Just You
2018/04/08 全球购物
波兰最大的宠物用品网上商店:FERA.PL
2019/08/11 全球购物
C语言怎样定义和声明全局变量和函数最好
2013/11/26 面试题
简述进程的启动、终止的方式以及如何进行进程的查看
2013/07/12 面试题
企业管理毕业生求职信范文
2014/03/07 职场文书
安装工程师岗位职责
2015/02/13 职场文书
远程教育培训心得体会
2016/01/09 职场文书