PyQt5实现下载进度条效果

作者:口嫌体正直 时间:2022-06-17 10:47:11 

起因是因为公司要开发一款自动登录某网站的助手工具提供给客户使用,要使用到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实现下载进度条效果

来源:https://blog.csdn.net/rain_of_mind/article/details/79989715

标签:PyQt5,进度条
0
投稿

猜你喜欢

  • 如何用Python进行时间序列分解和预测

    2022-06-20 14:39:42
  • 在Python程序中操作文件之flush()方法的使用教程

    2023-12-02 16:41:31
  • Python+ Flask实现Mock Server详情

    2021-02-11 19:56:28
  • AJAX初体验之上手篇

    2007-08-23 08:50:00
  • Python paramiko 模块浅谈与SSH主要功能模拟解析

    2023-10-01 11:06:28
  • python绘制分组对比柱状图

    2021-01-03 06:48:26
  • 理解 XMLDOM 的节选

    2008-02-17 14:48:00
  • 设计提升满意度

    2010-05-16 15:00:00
  • 困惹的A标签

    2007-12-04 12:36:00
  • Python简单生成随机姓名的方法示例

    2023-04-26 19:35:58
  • python虚拟环境的安装和配置(virtualenv,virtualenvwrapper)

    2021-05-13 17:40:35
  • python中leastsq函数的使用方法

    2023-11-11 06:03:28
  • python读取csv文件指定行的2种方法详解

    2022-06-06 13:35:24
  • 在Django的模型中执行原始SQL查询的方法

    2022-12-21 17:24:40
  • 利用python的socket发送http(s)请求方法示例

    2022-06-06 08:33:39
  • Python 调用VC++的动态链接库(DLL)

    2023-06-19 09:01:44
  • Python matplotlib生成图片背景透明的示例代码

    2022-07-04 06:22:57
  • python完成FizzBuzzWhizz问题(拉勾网面试题)示例

    2022-01-31 14:41:11
  • 还在手动盖楼抽奖?教你用Python实现自动评论盖楼抽奖(一)

    2023-12-26 21:32:41
  • Python内置函数property()如何使用

    2022-12-07 07:04:28
  • asp之家 网络编程 m.aspxhome.com