PyQt5实现下载进度条效果

起因是因为公司要开发一款自动登录某网站的助手工具提供给客户使用,要使用到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目录存在,默认我是将要更新的文件放在这个目录下面,还有优化的地方希望大家可以指出。

运行后效果:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • Python进度条实时显示处理进度的示例代码
  • Python实现采用进度条实时显示处理进度的方法
  • Python实现带百分比的进度条
  • Python在Console下显示文本进度条的方法
  • Python实现控制台进度条功能
  • python控制台中实现进度条功能
  • python在控制台输出进度条的方法
  • Python调用命令行进度条的方法
  • Python显示进度条的方法
  • PyQt5每天必学之进度条效果
(0)

相关推荐

  • PyQt5每天必学之进度条效果

    进度条是,当我们处理冗长的任务时使用的控件.它是以动画的形式让用户知道该任务正在取得进展.该QProgressBar控件提供一个水平或垂直进度条.程序员可以设置进度条的最小值和最大值.默认值是0到99. #!/usr/bin/python3 # -*- coding: utf-8 -*- """ PyQt5 教程 这个例子显示了一个进度条控件. 作者:我的世界你曾经来过 博客:http://blog.csdn.net/weiaitaowang 最后编辑:2016年8月3日 &

  • Python显示进度条的方法

    本文实例讲述了Python显示进度条的方法,是Python程序设计中非常实用的技巧.分享给大家供大家参考.具体方法如下: 首先,进度条和一般的print区别在哪里呢? 答案就是print会输出一个\n,也就是换行符,这样光标移动到了下一行行首,接着输出,之前已经通过stdout输出的东西依旧保留,而且保证我们在下面看到最新的输出结果. 进度条不然,我们必须再原地输出才能保证他是一个进度条,否则换行了怎么还叫进度条? 最简单的办法就是,再输出完毕后,把光标移动到行首,继续在那里输出更长的进度条即可

  • Python实现采用进度条实时显示处理进度的方法

    本文实例讲述了Python实现采用进度条实时显示处理进度的方法.分享给大家供大家参考,具体如下: 前言 在大多数时候,我们的程序会一直进行循环处理.这时候,我们非常希望能够知道程序的处理进度,由此来决定接下来该做些什么.接下来告诉大家如何简单又漂亮的实现这一功能. 如何使用这个类 使用这个类很简单,只需要三步即可完成,如下: process_bar = ShowProcess(max_steps) # 1.在循环前定义类的实体, max_steps是总的步数 for i in range(max

  • Python在Console下显示文本进度条的方法

    进度条实现原理 进度条和一般的print区别在哪里呢? 答案就是print会输出一个\n,也就是换行符,这样光标移动到了下一行行首,接着输出,之前已经通过stdout输出的东西依旧保留,而且保证我们在下面看到最新的输出结果. 进度条不然,我们必须再原地输出才能保证他是一个进度条,否则换行了怎么还叫进度条? 实现进度条最简单的办法就是,在输出完毕后,把光标移动到行首,继续在那里输出更长的进度条即可实现,新的更长的进度条把旧的短覆盖,就形成了动画效果. 在用Python处理耗时的任务时,往往希望能够

  • python在控制台输出进度条的方法

    本文实例讲述了python在控制台输出进度条的方法.分享给大家供大家参考.具体实现方法如下: 进度条效果如下所示: |#############################---------------------| 59 percent done 代码如下: class ProgressBar(): def __init__(self, width=50): self.pointer = 0 self.width = width def __call__(self,x): # x in p

  • Python调用命令行进度条的方法

    本文实例讲述了Python调用命令行进度条的方法.分享给大家供大家参考.具体分析如下: 关键点是输出'\r'这个字符可以使光标回到一行的开头,这时输出其它内容就会将原内容覆盖. import time import sys def progress_test(): bar_length=20 for percent in xrange(0, 100): hashes = '#' * int(percent/100.0 * bar_length) spaces = ' ' * (bar_lengt

  • Python进度条实时显示处理进度的示例代码

    前言 在大多数时候,我们的程序会一直进行循环处理.这时候,我们非常希望能够知道程序的处理进度,由此来决定接下来该做些什么.接下来告诉大家如何简单又漂亮的实现这一功能. 如何使用这个类 使用这个类很简单,只需要三步即可完成,如下: process_bar = ShowProcess(max_steps) # 1.在循环前定义类的实体, max_steps是总的步数 for i in range(max_steps + 1): process_bar.show_process() # 2.显示当前进

  • python控制台中实现进度条功能

    我们大多数人都希望写一些简单的python脚本的同时都想能够在程序运行的过程中实现进度条的功能以便查看程序运行的速度或者进度.今天就和大家探讨这个问题:如何在python控制台中实现进度条功 进度条最主要的问题就是所有字符全部在同一行,而且可以修改. 然而当执行print语句的时候,python会在打印完这个语句的同时在结尾加上'\n',也就是换行,这就导致在控制台下一旦被print之后就无法再修改了.所以我们现在的输出就不能再使用print来完成了. 我们要使用的是来自sys库的sys.std

  • Python实现带百分比的进度条

    大家在安装程序或下载文件时,通常都能看到进度条,提示你当前任务的进度.其实,在python中实现这个功能很简单,下面是具体代码.在实际应用中,你完全可以根据自己的要求进行修改!比如,示例中是通过time.sleep()方法进行时间延迟,你完全可以根据实际的程序运行耗时进行控制:同样,在进度百分比处,你也可以显示实际的进度比,而不是例子中机械的自增百分比. import sys import time def view_bar(num, total): rate = num / total rat

  • Python实现控制台进度条功能

    本文实例讲述了Python显示进度条的方法,是Python程序设计中非常实用的技巧.分享给大家供大家参考.具体方法如下: 首先,进度条和一般的print区别在哪里呢? 答案就是print会输出一个\n,也就是换行符,这样光标移动到了下一行行首,接着输出,之前已经通过stdout输出的东西依旧保留,而且保证我们在下面看到最新的输出结果. 进度条不然,我们必须再原地输出才能保证他是一个进度条,否则换行了怎么还叫进度条? 最简单的办法就是,再输出完毕后,把光标移动到行首,继续在那里输出更长的进度条即可

随机推荐