How to make a progress bar for downloading files from the internet in python for pyqt5 GUI

You need to write a script that will install the file from the Internet by clicking on the button, but it should be a progress bar that will show how many percent has already been downloaded.

You don'T need a console progress bar, but a progress bar on PyQt5!

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QWidget, QApplication, QVBoxLayout, QPushButton, 
QLineEdit, QFormLayout, QTextEdit
from PyQt5.QtCore import Qt
from PyQt5 import QtCore
import os.path
from threading import Thread
import traceback
from urllib.request import urlretrieve
from winreg import *
import os


aReg = ConnectRegistry(None, HKEY_LOCAL_MACHINE)
aKey = OpenKey(aReg, r"SOFTWARE\Bethesda Softworks\Skyrim Special Edition", 
0, KEY_READ | KEY_WOW64_32KEY)
gPath, _ = QueryValueEx(aKey, "Installed Path")

def download_file(url: str, file_name: str):
    try:
        local_file_name, _ = urlretrieve(url, file_name)
        print(os.path.abspath(local_file_name))
    except:
        print(traceback.format_exc())

    aReg = ConnectRegistry(None, HKEY_LOCAL_MACHINE)
    aKey = OpenKey(aReg, r"SOFTWARE\Bethesda Softworks\Skyrim Special 
Edition", 0, KEY_READ | KEY_WOW64_32KEY)
    gPath, _ = QueryValueEx(aKey, "Installed Path")

    import zipfile

    fantasy_zip = zipfile.ZipFile(sborka.zip)
    fantasy_zip.extractall(gPath)

    fantasy_zip.close()

   os.remove(sborka.zip)

...

button.clicked.connect(self.downloadevent)

...

def downloadevent(self):
    url = 'http://sborka.zip'

    file_name = 'sborka.zip'

    thread = Thread(target=download_file, args=(url, file_name))
    thread.start()
Author: Сергей, 2020-05-03

1 answers

I did it for PySide2 (checked it works), but there should be no problems with PyQt5:

For PyQt5

import sys
from PyQt5.QtWidgets import QApplication, QProgressBar, QWidget, QLineEdit, QPushButton,\
    QVBoxLayout, QHBoxLayout
from PyQt5.QtCore    import QThread, pyqtSignal
import urllib.request    

class Downloader(QThread):
    # Сигнал о количестве данных (PyQt5)
    preprogress = pyqtSignal(float)
    progress = pyqtSignal(float)

    # fileUrl - url - файла, включая сам файл
    # filename - имя файла
    def __init__(self, fileUrl, fileName):
        QThread.__init__(self)
        # Флаг инициализации
        self._init = False
        self.fileUrl = fileUrl
        self.fileName = fileName

    def run(self):
        # тест на локальных данных, но работать должно и с сетью
        urllib.request.urlretrieve(self.fileUrl, self.fileName, self._progress)

    def _progress(self, block_num, block_size, total_size):
        if not self._init:
            self.preprogress.emit(total_size)
            self._init = True

        # Расчет текущего количества данных
        downloaded = block_num * block_size
        if downloaded < total_size:
            # Отправляем промежуток
            self.progress.emit(downloaded)
        else:
            # Чтобы было 100%
            self.progress.emit(total_size)

class MainWindow(QWidget):
    def __init__(self):
        super().__init__()

        self.downloader = None

        self.fileUrl = QLineEdit()
        self.loadButton = QPushButton()
        self.loadButton.clicked.connect(self._loadFile)
        hbox = QHBoxLayout()            

        hbox.addWidget(self.fileUrl)
        hbox.addWidget(self.loadButton)

        vbox = QVBoxLayout(self)                                                    
        vbox.addLayout(hbox)                         
        self.bar = QProgressBar() 
        vbox.addWidget(self.bar)

    def _loadFile(self):
        ar = self.fileUrl.text().split('/')
        if len(ar) == 0:
            return
        fileName = f'_{ar[len(ar) -1]}'             

        self._download = Downloader(self.fileUrl.text(), fileName)        
        # Устанавливаем максимальный размер данных
        self._download.preprogress.connect(lambda x: self.bar.setMaximum(x))
        # Промежуточный/скачанный размер
        self._download.progress.connect(lambda d: self.bar.setValue(d))
        self._download.start()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

enter a description of the image here

Supplement

button.clicked.connect(self.downloadevent)
bar = QProgressBar()

def downloadevent(self):
    url = 'http://sborka.zip'
    file_name = 'sborka.zip'

    thread = Downloader(url, file_name)
    bar.show()
    thread.preprogress.connect(lambda x: bar.setMaximum(x))
    thread.progress.connect(lambda d: self.bar.setValue(d))
    thread.start()
 3
Author: Alexander Chernin, 2020-05-04 09:33:55