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判断字符串编码的简单实现方法(使用chardet)
Jul 01 Python
python实现多线程抓取知乎用户
Dec 12 Python
利用Python查看目录中的文件示例详解
Aug 28 Python
浅析python3字符串格式化format()函数的简单用法
Dec 07 Python
Django分页功能的实现代码详解
Jul 29 Python
Python实现的爬取豆瓣电影信息功能案例
Sep 15 Python
Django restframework 框架认证、权限、限流用法示例
Dec 21 Python
Python3 shutil(高级文件操作模块)实例用法总结
Feb 19 Python
Python文件夹批处理操作代码实例
Jul 21 Python
python 三种方法实现对Excel表格的读写
Nov 19 Python
解决virtualenv -p python3 venv报错的问题
Feb 05 Python
利用Python判断整数是否是回文数的3种方法总结
Jul 07 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
用libtemplate实现静态网页生成
2006/10/09 PHP
ASP和PHP都是可以删除自身的
2007/04/09 PHP
php 文件上传代码(限制jpg文件)
2010/01/05 PHP
php将url地址转化为完整的a标签链接代码(php为url地址添加a标签)
2014/01/17 PHP
PHP+ajax实现获取新闻数据简单示例
2018/05/08 PHP
ThinkPHP框架整合微信支付之JSAPI模式图文详解
2019/04/09 PHP
为Yahoo! UI Extensions Grid增加内置的可编辑器
2007/03/10 Javascript
JavaScript让网页出现渐隐渐显背景颜色的方法
2015/04/21 Javascript
常用javascript表单验证汇总
2020/07/20 Javascript
浅谈pc端rem字体设置的问题
2017/08/03 Javascript
浅谈js中的this问题
2017/08/31 Javascript
vue中使用vue-router切换页面时滚动条自动滚动到顶部的方法
2017/11/28 Javascript
vue项目实现记住密码到cookie功能示例(附源码)
2018/01/31 Javascript
解决Vue 通过下表修改数组,页面不渲染的问题
2018/03/08 Javascript
js中时间格式化的几种方法
2018/07/22 Javascript
如何从0开始用node写一个自己的命令行程序
2018/12/29 Javascript
微信小程序配置服务器提示验证token失败的解决方法
2019/04/03 Javascript
微信小程序基础教程之worker线程的使用方法
2019/07/15 Javascript
[02:35]DOTA2超级联赛专访XB 难忘一年九冠称王
2013/06/20 DOTA
[51:30]OG vs LGD 2018国际邀请赛淘汰赛BO3 第二场 8.26
2018/08/30 DOTA
Python基于time模块求程序运行时间的方法
2017/09/18 Python
解决Python requests库编码 socks5代理的问题
2018/05/07 Python
python样条插值的实现代码
2018/12/17 Python
Python3利用print输出带颜色的彩色字体示例代码
2019/04/08 Python
Python进程,多进程,获取进程id,给子进程传递参数操作示例
2019/10/11 Python
Python如何通过Flask-Mail发送电子邮件
2020/01/29 Python
tensorflow中tf.reduce_mean函数的使用
2020/04/19 Python
Keras Convolution1D与Convolution2D区别说明
2020/05/22 Python
世界上最大的餐具公司:Oneida
2016/12/17 全球购物
Aurora London官网:奢华、负担得起的皮革手袋
2020/08/01 全球购物
总账会计岗位职责
2014/03/13 职场文书
学雷锋志愿者活动总结
2014/06/27 职场文书
土建专业毕业生自荐书
2014/07/04 职场文书
2015年房地产销售工作总结
2015/04/20 职场文书
Python+OpenCV实现在图像上绘制矩形
2022/03/21 Python
VW、VH适配移动端的解决方案与常见问题
2023/05/21 HTML / CSS