PyQt5 implements download progress bar

The reason is because the company wants to develop an assistant tool for automatically logging in to a website for customers to use, and to use selenium, so it chooses the pyqt5 method to develop the client of this C/S architecture

The automatic update function is used in the process, so I write a download progress plug-in to share with everyone.

Interface file 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", "Client update downloading..."))


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_())

Implementation file 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 them
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 (process))
            self.fileobj.close()
            self.exit(0)
        except Exception as e:
            print (s)


class download(QDialog, Ui_download):
    """
    Download class implementation
    """
    def __init__(self, download_url, auto_close=True, parent=None):
        """
        Constructor
        
        @download_url: download address
        @auto_close: Whether it needs to be automatically closed after the download is complete
        """
        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_())

A relatively common download module. When initializing the call, you only need to pass in the address to be downloaded. The download operation is asynchronous to prevent the UI from blocking. Make sure that the update directory exists in the program directory. By default, I put the file to be updated in this. Below the directory, there are still optimizations that I hope you can point out.

After running the effect:


Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=324643347&siteId=291194637