Как сделать прогресс бар для загрузки файлов с интернета в python для pyqt5 GUI
Нужно написать скрипт который по клику на кнопку установит файл с интернета, но это должен быть прогресс бар, который покажет сколько процентов уже загружено.
Нужен НЕ консольный прогресс бар, а прогресс бар на 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()
Ответы (1 шт):
Автор решения: Alexander Chernin
→ Ссылка
Сделал для PySide2 (проверил, работает), но проблем с PyQt5 быть не должно:
Для 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_())
Дополнение
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()
