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