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 多线程应用介绍
Dec 19 Python
Python使用PIL库实现验证码图片的方法
Mar 11 Python
深入理解Django中内置的用户认证
Oct 06 Python
python音频处理用到的操作的示例代码
Oct 27 Python
Python自定义线程池实现方法分析
Feb 07 Python
实例详解python函数的对象、函数嵌套、名称空间和作用域
May 31 Python
python 列表推导式使用详解
Aug 29 Python
Python selenium模拟手动操作实现无人值守刷积分功能
May 13 Python
python 如何将office文件转换为PDF
Sep 22 Python
Python通过format函数格式化显示值
Oct 17 Python
关于Python 解决Python3.9 pandas.read_excel(‘xxx.xlsx‘)报错的问题
Nov 28 Python
python面向对象版学生信息管理系统
Jun 24 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过滤所有恶意字符(批量过滤post,get敏感数据)
2014/03/18 PHP
php实现的简单美国商品税计算函数
2015/07/13 PHP
PHP使用数组依次替换字符串中匹配项
2016/01/08 PHP
php微信公众平台开发(一) 配置接口
2016/12/06 PHP
EasyUI中的tree用法介绍
2011/11/01 Javascript
别了 JavaScript中的isXX系列
2012/08/01 Javascript
chrome下jq width()方法取值为0的解决方法
2014/05/26 Javascript
基于JavaScript实现通用tab选项卡(通用性强)
2016/01/07 Javascript
AngularJS手动表单验证
2016/02/01 Javascript
批量下载对路网图片并生成html的实现方法
2016/06/07 Javascript
举例讲解jQuery对DOM元素的向上遍历、向下遍历和水平遍历
2016/07/07 Javascript
Vue2.0实现购物车功能
2017/06/05 Javascript
Express进阶之log4js实用入门指南
2018/02/10 Javascript
使用electron制作满屏心特效的示例代码
2018/11/27 Javascript
继承行为在 ES5 与 ES6 中的区别详解
2019/12/24 Javascript
[36:29]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 LGD vs TNC
2018/04/02 DOTA
python代码制作configure文件示例
2014/07/28 Python
Python使用reportlab将目录下所有的文本文件打印成pdf的方法
2015/05/20 Python
CentOS中使用virtualenv搭建python3环境
2015/06/08 Python
python实现爬虫统计学校BBS男女比例(一)
2015/12/31 Python
python使用tkinter实现简单计算器
2018/01/30 Python
java中两个byte数组实现合并的示例
2018/05/09 Python
Django项目中添加ldap登陆认证功能的实现
2019/04/04 Python
Python任务调度利器之APScheduler详解
2020/04/02 Python
CSS3 3D位移translate效果实例介绍
2016/05/03 HTML / CSS
求两个数的乘积和商数,该作用由宏定义来实现
2013/03/13 面试题
三下乡活动方案
2014/01/31 职场文书
新农村建设典型材料
2014/05/31 职场文书
数控专业毕业生求职信
2014/06/12 职场文书
应届大专生求职信
2014/06/26 职场文书
大一工商管理职业生涯规划:有梦最美,行动相随
2014/09/18 职场文书
2015年设计师个人工作总结
2015/04/25 职场文书
导游词之河北野三坡
2019/12/11 职场文书
JavaScript异步操作中串行和并行
2021/11/20 Javascript
SpringBoot 整合mongoDB并自定义连接池的示例代码
2022/02/28 MongoDB
教你使用Ubuntu搭建DNS服务器
2022/09/23 Servers