From 6d3e119260e2378841cff3e209cd51c7f4406522 Mon Sep 17 00:00:00 2001
From: Rui Ma
Date: Wed, 6 May 2020 19:50:11 +0800
Subject: [PATCH 01/11] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E4=B8=8B?=
=?UTF-8?q?=E8=BD=BD=E5=99=A8=E6=A8=A1=E5=9D=97?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
增加了下载器模块
---
.idea/workspace.xml | 82 ++--
Sub_Thread.py | 173 ++++++++-
download_function.py | 77 ++++
download_window.py | 127 +++++++
download_window.ui | 256 +++++++++++++
function.py | 162 +++++++-
main_window.py | 329 +++++++++++++++-
main_window.ui | 883 ++++++++++++++++++++++++++++++++++++++++++-
soft_cfg.py | 2 +-
9 files changed, 2036 insertions(+), 55 deletions(-)
create mode 100644 download_function.py
create mode 100644 download_window.py
create mode 100644 download_window.ui
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index dd91385..a111f90 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -35,7 +35,7 @@
-
+
@@ -48,7 +48,7 @@
-
+
@@ -78,7 +78,7 @@
-
+
@@ -90,7 +90,7 @@
-
+
@@ -99,7 +99,7 @@
-
+
@@ -111,7 +111,7 @@
-
+
@@ -120,7 +120,7 @@
-
+
@@ -132,7 +132,7 @@
-
+
@@ -143,11 +143,11 @@
-
-
-
+
+
+
@@ -169,57 +169,73 @@
-
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
+
-
-
-
+
+
+
+
-
-
-
+
+
+
+
-
-
-
+
+
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
+
+
+
+
+
-
+
-
+
\ No newline at end of file
diff --git a/Sub_Thread.py b/Sub_Thread.py
index 85751d8..97799a4 100644
--- a/Sub_Thread.py
+++ b/Sub_Thread.py
@@ -1,8 +1,9 @@
+import os
+
from PyQt5.QtCore import QThread, pyqtSignal
import time
import requests
import json
-import psutil
import soft_cfg
@@ -14,6 +15,7 @@ def cache_data(name, msm=None):
with open(f"{name}.json", "r") as f:
return f.readline()
+
class Time_Thread(QThread):
thread_signal = pyqtSignal(str)
@@ -88,7 +90,6 @@ def __init__(self, auto):
def run(self):
try:
- # raise FileExistsError
result = json.loads(requests.get(soft_cfg.update_url, timeout=3).text)
except:
result = {"Version": soft_cfg.version}
@@ -97,3 +98,171 @@ def run(self):
else:
result["auto"] = False
self.display_signal.emit(result)
+
+
+class DownloaderNornal(QThread):
+ thread_signal = pyqtSignal(int)
+
+ def __init__(self, choose, url, saveFile, start, end, threadId, chunkSize=10240):
+ super().__init__()
+ self.choose = choose
+ self.saveFile = saveFile
+ self.url = url
+ self.dstart = start
+ self.dend = end
+ self.threadId = threadId
+ self.chunkSize = chunkSize
+
+ def run(self):
+ if self.choose == 1:
+ self.run_normal()
+ else:
+ self.run_special()
+
+ def run_normal(self):
+ start = self.dstart
+ end = self.dend
+ threadId = self.threadId
+ chunkSize = self.chunkSize
+ for _ in range(30):
+ try:
+ headers = {'Range': f'bytes={start}-{end}'}
+ req = requests.get(self.url, headers=headers, timeout=5, stream=True)
+ subSize = 0
+ with open(self.saveFile, 'rb+') as fo:
+ fo.seek(start)
+ for chunk in req.iter_content(chunk_size=chunkSize):
+ if chunk:
+ fo.write(chunk)
+ start += chunkSize
+ subSize += chunkSize
+ self.thread_signal.emit(threadId)
+
+ return
+ except Exception as e:
+ print(f"Download_Thread: {e}")
+
+ def run_special(self):
+ start = self.dstart
+ end = self.dend
+ threadId = self.threadId
+ chunkSize = self.chunkSize
+ for _ in range(15):
+ try:
+ req = requests.get(self.url, timeout=30, stream=True)
+ subSize = 0
+ with open(self.saveFile, 'rb+') as fo:
+ fo.seek(start)
+ for chunk in req.iter_content(chunk_size=chunkSize):
+ if chunk:
+ fo.write(chunk)
+ start += chunkSize
+ subSize += chunkSize
+ self.thread_signal.emit(threadId)
+
+ return
+ except Exception as e:
+ print(f"Download_Thread: {e}")
+
+
+class Download_Thread(QThread):
+ thread_signal = pyqtSignal(dict)
+
+ def __init__(self, url, threadNum, saveFile):
+ super().__init__()
+ self.startTime = time.time()
+ self.url = url
+ self.threadNum = threadNum
+ self.saveFile = saveFile
+ self.feedback = {
+ 'info': {
+ 'size': 0,
+ 'url': self.url,
+ 'saveTo': self.saveFile,
+ 'downloader': 1,
+ 'started': 0,
+ 'averageSpeed': 0,
+ 'thread': self.threadNum
+ },
+ 'main': {
+ 'data': 0,
+ 'speed': 0,
+ },
+ 'sub': {
+ 'data': [[0, 0] for i in range(self.threadNum)],
+ 'stat': [1 for i in range(self.threadNum)]
+ }
+ }
+ self.threads = {}
+
+ # 302迭代寻址
+ req = requests.head(self.url)
+ while req.status_code == 302:
+ self.url = req.headers['Location']
+ self.feedback['info']['url'] = self.url
+
+ def run(self):
+ if os.path.exists(self.saveFile):
+ self.thread_signal.emit({'fileExists': 1, 'filePath': self.saveFile})
+ else:
+ try:
+ self.runDownloaderNormal()
+ except:
+ self.downloaderSpecial()
+
+ def downloaderNormal(self, start, end, threadId, chunkSize=10240):
+ self.threads[f'thread{threadId}'] = DownloaderNornal(1, self.url, self.saveFile, start, end, threadId)
+ self.threads[f'thread{threadId}'].thread_signal.connect(self.resizeThread)
+ self.threads[f'thread{threadId}'].start()
+
+ def resizeThread(self, threadId):
+ chunkSize = 10240
+ if threadId == 99:
+ self.feedback['main']['data'] += chunkSize
+ else:
+ self.feedback['main']['data'] += chunkSize
+ self.feedback['sub']['data'][threadId][0] += chunkSize
+ self.feedback['sub']['stat'][threadId] = 1
+
+ def runDownloaderNormal(self):
+ req = requests.head(self.url)
+ self.feedback['info']['size'] = int(req.headers['Content-Length'])
+ self.thread_signal.emit(self.feedback)
+ # 初始化下载文件, 创建一个与文件大小相同的空间
+ fo = open(self.saveFile, 'wb')
+ fo.truncate(self.feedback['info']['size'])
+ fo.close()
+ self.feedback['info']['started'] = 1
+ splitPart = self.feedback['info']['size'] // self.threadNum
+ for i in range(self.threadNum):
+ self.feedback['sub']['data'][i][1] = splitPart
+
+ for i in range(self.threadNum):
+ start = splitPart * i
+ end = self.feedback['info']['size'] if i == self.threadNum - 1 else start + splitPart - 1
+ self.downloaderNormal(start, end, i)
+ self.sendSignal()
+
+ def downloaderSpecial(self, chunkSize=10240):
+ self.feedback['info']['downloader'] = 0
+ self.feedback['info']['started'] = 1
+ self.feedback['info']['size'] = 99999
+ self.threads[f'thread99'] = DownloaderNornal(0, self.url, self.saveFile, 0, 0, 99)
+ self.threads[f'thread99'].thread_signal.connect(self.resizeThread)
+ self.threads[f'thread99'].start()
+ self.sendSignal()
+
+ def sendSignal(self):
+ while True:
+ savedData = self.feedback['main']['data']
+ time.sleep(.5)
+ speed = (self.feedback['main']['data'] - savedData) * 2
+ self.feedback['main']['speed'] = speed
+ self.thread_signal.emit(self.feedback)
+ if self.feedback['main']['data'] >= self.feedback['info']['size']:
+ self.feedback['main']['data'] = self.feedback['info']['size']
+ endTime = time.time()
+ speed = self.feedback['info']['size'] / (endTime - self.startTime)
+ self.feedback['info']['averageSpeed'] = speed
+ self.thread_signal.emit(self.feedback)
+ break
diff --git a/download_function.py b/download_function.py
new file mode 100644
index 0000000..30ac074
--- /dev/null
+++ b/download_function.py
@@ -0,0 +1,77 @@
+import os
+
+from PyQt5.QtCore import pyqtSignal, Qt
+from PyQt5.QtGui import QCursor
+from PyQt5.QtWidgets import QMessageBox
+from download_window import Ui_Dialog
+from PyQt5 import QtWidgets, QtCore
+
+
+class Download_UI(Ui_Dialog, QtWidgets.QDialog):
+ mySignal = pyqtSignal(list)
+
+ def __init__(self):
+ super(Download_UI, self).__init__()
+ self.setupUi(self)
+ self.m_flag = False
+ self.setFixedSize(self.width(), self.height())
+ self.setWindowFlag(QtCore.Qt.FramelessWindowHint) # 隐藏边框
+ # self.setWindowFlag(QtCore.Qt.WindowStaysOnTopHint) # 窗口始终置顶
+ self.pushButton_quit.clicked.connect(self.close)
+ self.pushButton_start.clicked.connect(self.startDownload)
+ for i in range(16):
+ self.comboBox_thread.addItem(str(i+1))
+ self.comboBox_thread.setCurrentIndex(7)
+ self.textEdit_link.textChanged.connect(self.linkChanged)
+ self.pushButton_choose_dir.clicked.connect(self.chooseDir)
+
+ def linkChanged(self):
+ if self.textEdit_link.toPlainText().strip()[:4] == 'http':
+ self.lineEdit_dir.setText(f"{self.lineEdit_dir.text()}{os.path.basename(self.textEdit_link.toPlainText().strip())}")
+ else:
+ pass
+
+ def chooseDir(self):
+ directory = QtWidgets.QFileDialog.getExistingDirectory(self, "getExistingDirectory", "./")
+ fileName = os.path.basename(self.textEdit_link.toPlainText().strip())
+ if fileName:
+ self.lineEdit_dir.setText(f"{directory}/{fileName}")
+ else:
+ self.lineEdit_dir.setText(f"{directory}/")
+
+ def startDownload(self):
+ url = self.textEdit_link.toPlainText().strip()
+ thread = self.comboBox_thread.currentIndex() + 1
+ fileName = self.lineEdit_dir.text()
+ if url[:4] != 'http':
+ self.textEdit_link.clear()
+ self.lineEdit_dir.setText('')
+ self.textEdit_link.setPlaceholderText("当前程序仅支持http/https协议的下载链接")
+ elif fileName == '':
+ self.textEdit_link.clear()
+ self.textEdit_link.setPlaceholderText("文件保存路径设置不正确,请重新查看")
+ else:
+ self.mySignal.emit([url, thread, fileName])
+ self.close()
+
+ def mousePressEvent(self, event):
+ if event.button() == Qt.LeftButton:
+ self.m_flag = True
+ self.m_Position = event.globalPos() - self.pos() # 获取鼠标相对窗口的位置
+ event.accept()
+ self.setCursor(QCursor(Qt.OpenHandCursor)) # 更改鼠标图标
+
+ def mouseMoveEvent(self, QMouseEvent):
+ if Qt.LeftButton and self.m_flag:
+ self.move(QMouseEvent.globalPos() - self.m_Position) # 更改窗口位置
+ QMouseEvent.accept()
+
+ def mouseReleaseEvent(self, QMouseEvent):
+ self.m_flag = False
+ self.setCursor(QCursor(Qt.ArrowCursor))
+
+ def keyPressEvent(self, e):
+ if e.key() == Qt.Key_Return: # 重写Esc键事件
+ pass
+ elif e.key() == Qt.Key_Enter:
+ pass
\ No newline at end of file
diff --git a/download_window.py b/download_window.py
new file mode 100644
index 0000000..eaae5e6
--- /dev/null
+++ b/download_window.py
@@ -0,0 +1,127 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'download_window.ui'
+#
+# Created by: PyQt5 UI code generator 5.14.2
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_Dialog(object):
+ def setupUi(self, Dialog):
+ Dialog.setObjectName("Dialog")
+ Dialog.resize(600, 360)
+ self.horizontalLayout = QtWidgets.QHBoxLayout(Dialog)
+ self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
+ self.horizontalLayout.setSpacing(0)
+ self.horizontalLayout.setObjectName("horizontalLayout")
+ self.widget = QtWidgets.QWidget(Dialog)
+ self.widget.setStyleSheet("QWidget#widget{background:#FFFFFF;border-radius:3px;box-shadow: 0 0 10px #f00; border:1px solid green}")
+ self.widget.setObjectName("widget")
+ self.verticalLayout = QtWidgets.QVBoxLayout(self.widget)
+ self.verticalLayout.setObjectName("verticalLayout")
+ self.textEdit_link = QtWidgets.QTextEdit(self.widget)
+ font = QtGui.QFont()
+ font.setFamily("微软雅黑")
+ self.textEdit_link.setFont(font)
+ self.textEdit_link.setStyleSheet("QTextEdit{background:Transparent;border:1px solid grey;}")
+ self.textEdit_link.setObjectName("textEdit_link")
+ self.verticalLayout.addWidget(self.textEdit_link)
+ self.widget_2 = QtWidgets.QWidget(self.widget)
+ self.widget_2.setObjectName("widget_2")
+ self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.widget_2)
+ self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
+ self.horizontalLayout_2.setSpacing(8)
+ self.horizontalLayout_2.setObjectName("horizontalLayout_2")
+ self.lineEdit_dir = QtWidgets.QLineEdit(self.widget_2)
+ self.lineEdit_dir.setMinimumSize(QtCore.QSize(0, 25))
+ self.lineEdit_dir.setStyleSheet("QLineEdit{background:Transparent;border:1px solid grey}")
+ self.lineEdit_dir.setObjectName("lineEdit_dir")
+ self.horizontalLayout_2.addWidget(self.lineEdit_dir)
+ self.pushButton_choose_dir = QtWidgets.QPushButton(self.widget_2)
+ self.pushButton_choose_dir.setMinimumSize(QtCore.QSize(70, 25))
+ font = QtGui.QFont()
+ font.setFamily("微软雅黑")
+ self.pushButton_choose_dir.setFont(font)
+ self.pushButton_choose_dir.setStyleSheet("QPushButton{background:Transparent;border:1px solid grey;border-radius:3px}\n"
+"QPushButton:hover{background-color:rgba(102,153,255,0.6);}")
+ self.pushButton_choose_dir.setObjectName("pushButton_choose_dir")
+ self.horizontalLayout_2.addWidget(self.pushButton_choose_dir)
+ self.label = QtWidgets.QLabel(self.widget_2)
+ self.label.setMinimumSize(QtCore.QSize(0, 25))
+ font = QtGui.QFont()
+ font.setFamily("微软雅黑")
+ self.label.setFont(font)
+ self.label.setObjectName("label")
+ self.horizontalLayout_2.addWidget(self.label)
+ self.comboBox_thread = QtWidgets.QComboBox(self.widget_2)
+ self.comboBox_thread.setMinimumSize(QtCore.QSize(0, 25))
+ font = QtGui.QFont()
+ font.setFamily("微软雅黑")
+ self.comboBox_thread.setFont(font)
+ self.comboBox_thread.setStyleSheet("QComboBox::drop-down {\n"
+" subcontrol-origin: padding;\n"
+" subcontrol-position: top right;\n"
+" width: 20px;\n"
+" \n"
+" border-left-width: 1px;\n"
+" border-left-color: darkgray;\n"
+" border-left-style: solid; /* just a single line */\n"
+" border-top-right-radius: 5px; /* same radius as the QComboBox */\n"
+" border-bottom-right-radius: 5px;\n"
+"}\n"
+"")
+ self.comboBox_thread.setObjectName("comboBox_thread")
+ self.horizontalLayout_2.addWidget(self.comboBox_thread)
+ self.verticalLayout.addWidget(self.widget_2)
+ self.widget_3 = QtWidgets.QWidget(self.widget)
+ self.widget_3.setObjectName("widget_3")
+ self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.widget_3)
+ self.horizontalLayout_3.setContentsMargins(0, 0, 0, 0)
+ self.horizontalLayout_3.setSpacing(8)
+ self.horizontalLayout_3.setObjectName("horizontalLayout_3")
+ self.label_2 = QtWidgets.QLabel(self.widget_3)
+ font = QtGui.QFont()
+ font.setFamily("微软雅黑")
+ self.label_2.setFont(font)
+ self.label_2.setObjectName("label_2")
+ self.horizontalLayout_3.addWidget(self.label_2)
+ spacerItem = QtWidgets.QSpacerItem(373, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+ self.horizontalLayout_3.addItem(spacerItem)
+ self.pushButton_start = QtWidgets.QPushButton(self.widget_3)
+ self.pushButton_start.setMinimumSize(QtCore.QSize(70, 25))
+ font = QtGui.QFont()
+ font.setFamily("微软雅黑")
+ self.pushButton_start.setFont(font)
+ self.pushButton_start.setStyleSheet("QPushButton{background:Transparent;border:1px solid grey;border-radius:3px}\n"
+"QPushButton:hover{background-color:rgba(102,153,255,0.6);}")
+ self.pushButton_start.setObjectName("pushButton_start")
+ self.horizontalLayout_3.addWidget(self.pushButton_start)
+ self.pushButton_quit = QtWidgets.QPushButton(self.widget_3)
+ self.pushButton_quit.setMinimumSize(QtCore.QSize(70, 25))
+ font = QtGui.QFont()
+ font.setFamily("微软雅黑")
+ self.pushButton_quit.setFont(font)
+ self.pushButton_quit.setStyleSheet("QPushButton{background:Transparent;border:1px solid grey;border-radius:3px}\n"
+"QPushButton:hover{background-color:rgba(102,153,255,0.6);}")
+ self.pushButton_quit.setObjectName("pushButton_quit")
+ self.horizontalLayout_3.addWidget(self.pushButton_quit)
+ self.verticalLayout.addWidget(self.widget_3)
+ self.horizontalLayout.addWidget(self.widget)
+
+ self.retranslateUi(Dialog)
+ QtCore.QMetaObject.connectSlotsByName(Dialog)
+
+ def retranslateUi(self, Dialog):
+ _translate = QtCore.QCoreApplication.translate
+ Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
+ self.textEdit_link.setPlaceholderText(_translate("Dialog", "请输入网址(目前支持http/https下载链接)"))
+ self.pushButton_choose_dir.setToolTip(_translate("Dialog", "
选择文件保存路径
"))
+ self.pushButton_choose_dir.setText(_translate("Dialog", "选择目录"))
+ self.label.setText(_translate("Dialog", "使用线程:"))
+ self.label_2.setText(_translate("Dialog", "请确保链接填写正确"))
+ self.pushButton_start.setText(_translate("Dialog", "开始下载"))
+ self.pushButton_quit.setText(_translate("Dialog", "取消"))
diff --git a/download_window.ui b/download_window.ui
new file mode 100644
index 0000000..22293ec
--- /dev/null
+++ b/download_window.ui
@@ -0,0 +1,256 @@
+
+
+ Dialog
+
+
+
+ 0
+ 0
+ 600
+ 360
+
+
+
+ Dialog
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+ -
+
+
+ QWidget#widget{background:#FFFFFF;border-radius:3px;box-shadow: 0 0 10px #f00; border:1px solid green}
+
+
+
-
+
+
+
+ 微软雅黑
+
+
+
+ QTextEdit{background:Transparent;border:1px solid grey;}
+
+
+ 请输入网址(目前支持http/https下载链接)
+
+
+
+ -
+
+
+
+ 8
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+
+ 0
+ 25
+
+
+
+ QLineEdit{background:Transparent;border:1px solid grey}
+
+
+
+ -
+
+
+
+ 70
+ 25
+
+
+
+
+ 微软雅黑
+
+
+
+ <html><head/><body><p>选择文件保存路径</p></body></html>
+
+
+ QPushButton{background:Transparent;border:1px solid grey;border-radius:3px}
+QPushButton:hover{background-color:rgba(102,153,255,0.6);}
+
+
+ 选择目录
+
+
+
+ -
+
+
+
+ 0
+ 25
+
+
+
+
+ 微软雅黑
+
+
+
+ 使用线程:
+
+
+
+ -
+
+
+
+ 0
+ 25
+
+
+
+
+ 微软雅黑
+
+
+
+ QComboBox::drop-down {
+ subcontrol-origin: padding;
+ subcontrol-position: top right;
+ width: 20px;
+
+ border-left-width: 1px;
+ border-left-color: darkgray;
+ border-left-style: solid; /* just a single line */
+ border-top-right-radius: 5px; /* same radius as the QComboBox */
+ border-bottom-right-radius: 5px;
+}
+
+
+
+
+
+
+
+ -
+
+
+
+ 8
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+
+ 微软雅黑
+
+
+
+ 请确保链接填写正确
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 373
+ 20
+
+
+
+
+ -
+
+
+
+ 70
+ 25
+
+
+
+
+ 微软雅黑
+
+
+
+ QPushButton{background:Transparent;border:1px solid grey;border-radius:3px}
+QPushButton:hover{background-color:rgba(102,153,255,0.6);}
+
+
+ 开始下载
+
+
+
+ -
+
+
+
+ 70
+ 25
+
+
+
+
+ 微软雅黑
+
+
+
+ QPushButton{background:Transparent;border:1px solid grey;border-radius:3px}
+QPushButton:hover{background-color:rgba(102,153,255,0.6);}
+
+
+ 取消
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/function.py b/function.py
index 0db98b1..aca5189 100644
--- a/function.py
+++ b/function.py
@@ -12,16 +12,14 @@
from Sub_Thread import Source_Thread
from Sub_Thread import Article_Thread
from Sub_Thread import Update_Thread
+from Sub_Thread import Download_Thread
+from download_function import Download_UI
import soft_cfg
md5obj = hashlib.md5()
file = os.path.realpath(__file__)
-def window_close(code):
- qApp.exit(code)
-
-
def open_browser(url):
QtGui.QDesktopServices.openUrl(QtCore.QUrl(url))
@@ -115,6 +113,23 @@ def __init__(self):
self.article_url = [] # 文章教程链接初始化
self.label_10.hide()
self.label_sys_info.hide()
+ self.pros = [self.progressBar_downloader_sub0, self.progressBar_downloader_sub1,
+ self.progressBar_downloader_sub2, self.progressBar_downloader_sub3,
+ self.progressBar_downloader_sub4, self.progressBar_downloader_sub5,
+ self.progressBar_downloader_sub6, self.progressBar_downloader_sub7,
+ self.progressBar_downloader_sub8, self.progressBar_downloader_sub9,
+ self.progressBar_downloader_sub10, self.progressBar_downloader_sub11,
+ self.progressBar_downloader_sub12, self.progressBar_downloader_sub13,
+ self.progressBar_downloader_sub14, self.progressBar_downloader_sub15]
+ for i in self.pros:
+ i.hide()
+ self.progressBar_downloader_main.hide()
+ self.textEdit_download_sub.hide()
+ msm = f"欢迎试用此下载器
" \
+ f"本软件为开源项目,可点击左侧'源码仓库'菜单,点击'System-assistant'查看程序源码
" \
+ f"当前版本仅支持http/https下载协议的下载链接,其他协议链接正在添加中
" \
+ f"程序功能正在逐步完善中,敬请期待...
"
+ self.textEdit_download_top.append(msm)
# 线程启动
self.time_thread()
@@ -124,13 +139,14 @@ def __init__(self):
def signal_on_btn(self):
# 基础按钮事件绑定
- self.pushButton_close.clicked.connect(lambda: window_close(0))
+ self.pushButton_close.clicked.connect(lambda: self.window_close(0))
self.pushButton_min.clicked.connect(lambda: self.showMinimized())
self.pushButton_feedback.clicked.connect(lambda: open_browser(soft_cfg.feed_back))
self.pushButton_web_site.clicked.connect(lambda: open_browser(soft_cfg.web_site))
self.pushButton_help_us.clicked.connect(lambda: open_browser(soft_cfg.help_us))
self.pushButton_web_rights.clicked.connect(self.licenses)
self.pushButton_update.clicked.connect(self.update_thread)
+ self.pushButton_downloader_new.clicked.connect(self.open_download_win)
# List Widget点击事件
self.listWidget_source.itemClicked.connect(self.source_item_clicked)
@@ -143,6 +159,7 @@ def signal_on_btn(self):
self.pushButton_menu_article.clicked.connect(lambda: self.stackedWidget.setCurrentIndex(2))
self.pushButton_menu_source.clicked.connect(lambda: self.stackedWidget.setCurrentIndex(3))
self.pushButton_menu_about_us.clicked.connect(lambda: self.stackedWidget.setCurrentIndex(4))
+ self.pushButton_menu_downloader.clicked.connect(lambda: self.stackedWidget.setCurrentIndex(7))
def icon_on_btn(self):
self.pushButton_feedback.setIcon(qtawesome.icon('fa.envelope-o', color="blank"))
@@ -155,8 +172,19 @@ def icon_on_btn(self):
self.pushButton_menu_article.setIcon(qtawesome.icon('fa.file-text', color='white'))
self.pushButton_menu_source.setIcon(qtawesome.icon('fa.code', color='white'))
self.pushButton_menu_soft.setIcon(qtawesome.icon('fa.th-large', color='white'))
+ self.pushButton_menu_downloader.setIcon(qtawesome.icon('fa.download', color='white'))
+ # 下载器
+ self.pushButton_downloader_new.setIcon(qtawesome.icon('fa.plus', color='blue'))
# 自定义功能区
+ def window_close(self, code):
+ res = QMessageBox.question(self, '是否关闭程序', '请确保没有下载任务', QMessageBox.Yes | QMessageBox.No,
+ QMessageBox.No)
+ if res == QMessageBox.Yes:
+ qApp.exit(code)
+ else:
+ pass
+
def open_api_site(self): # 接口文档 --跳转到API网页
res = QMessageBox.question(self, '提示', '即将在浏览器中打开接口文档,需登录后才可使用本站API,是否继续?', QMessageBox.Yes | QMessageBox.No,
QMessageBox.No)
@@ -252,6 +280,130 @@ def Article_UI(self, msm):
def article_item_clicked(self, item):
open_browser(self.article_url[self.listWidget_article.currentIndex().row()])
+ def open_download_win(self):
+ downloadWin = Download_UI()
+ downloadWin.mySignal.connect(self.download_thread)
+ downloadWin.exec_()
+
+ def download_thread(self, msm):
+ url = msm[0]
+ thread = msm[1]
+ fileName = msm[2]
+ self.progressBar_downloader_main.show()
+ self.textEdit_download_sub.show()
+ self.download_Thread = Download_Thread(url, thread, fileName)
+ self.download_Thread.thread_signal.connect(self.downloadThread)
+ self.download_Thread.start()
+ self.progressBar_downloader_main.setValue(0)
+ for i in self.pros:
+ i.setValue(0)
+ for i in range(thread):
+ self.pros[i].show()
+
+ def downloadThread(self, msm):
+ self.textEdit_download_top.clear()
+ self.textEdit_download_sub.clear()
+ isExists = msm.get('fileExists', 0)
+ if isExists == 1:
+ QMessageBox.information(self, '文件已经存在', f'检测到您要下载的文件已经存在,如果想要重新下载请删除 {msm["filePath"]} 后再进行下载')
+ self.textEdit_download_top.append(f'检测到您要下载的文件已经存在
如果想要重新下载请删除 {msm["filePath"]} 后再进行下载
')
+ self.textEdit_download_sub.hide()
+ self.progressBar_downloader_main.hide()
+ for i in self.pros:
+ i.hide()
+ else:
+ isStarted = msm['info']['started']
+ isMutiThread = msm['info']['downloader']
+ isFinished = msm['info']['averageSpeed']
+ if isStarted == 0:
+ self.textEdit_download_top.append(f"下载程序正在初始化,这个过程不会很长\n请稍等...")
+ else:
+ if isMutiThread == 1 and isFinished == 0:
+ ospeed = msm['main']['speed'] / 1024
+ if ospeed == 0:
+ ospeed = 1
+ if ospeed > 1024:
+ speed = f"{round(ospeed / 1024, 2)} M/s"
+ else:
+ speed = f"{ospeed} KB/s"
+ underTime = (msm['info']['size'] - msm['main']['data']) / 1024 / ospeed
+ if underTime > 60:
+ underTime = f"{int(underTime / 60)} 分钟 {int(underTime % 60)} 秒"
+ else:
+ underTime = f"{int(underTime)} 秒"
+ self.textEdit_download_top.append(
+ f"文件来源:{msm['info']['url']}\n文件大小:{round(msm['info']['size'] / 1024 / 1024, 2)} MB\n已经下载:{round(msm['main']['data'] / 1024 / 1024, 2)} MB\n传输速度:{speed}\n剩余时间:{underTime}\n储存至:{msm['info']['saveTo']}\n")
+ # 子进度条设置进度
+ for i in range(msm['info']['thread']):
+ self.pros[i].setValue(int(msm['sub']['data'][i][0] / msm['sub']['data'][i][1] * 100))
+ # 主进度条设置进度
+ self.progressBar_downloader_main.setValue(int(msm['main']['data'] / msm['info']['size'] * 100))
+ # 子线程数据显示
+ self.textEdit_download_sub.clear()
+ for i in range(msm['info']['thread']):
+ savedSubData = msm['sub']['data'][i][0] / 1024
+ if savedSubData > 1024:
+ savedSubData = f"{round(savedSubData / 1024, 2)} MB"
+ else:
+ savedSubData = f"{savedSubData} KB"
+ if int(msm['sub']['data'][i][0] / 1024) >= int(msm['sub']['data'][i][1] / 1024):
+ self.textEdit_download_sub.append(f"线程{i + 1}:已接收 {savedSubData},接收完成.")
+ else:
+ self.textEdit_download_sub.append(f"线程{i + 1}:已接收 {savedSubData},正在接收...")
+ scrollbar = self.textEdit_download_sub.verticalScrollBar()
+ scrollbar.setSliderPosition(0)
+ elif isMutiThread == 1 and isFinished != 0:
+ # 下载完成,隐藏子进度条
+ for i in range(msm['info']['thread']):
+ self.pros[i].hide()
+ # 子线程数据显示
+ self.textEdit_download_sub.clear()
+ for i in range(msm['info']['thread']):
+ savedSubData = msm['sub']['data'][i][0] / 1024
+ if savedSubData > 1024:
+ savedSubData = f"{round(savedSubData / 1024, 2)} MB"
+ else:
+ savedSubData = f"{savedSubData} KB"
+ self.textEdit_download_sub.append(f"线程{i + 1}:已接收 {savedSubData},接收完成.")
+ self.textEdit_download_sub.append(f"文件下载完成,已经保存到了 {msm['info']['saveTo']} ")
+ scrollbar = self.textEdit_download_sub.verticalScrollBar()
+ scrollbar.setSliderPosition(0)
+ speed = isFinished / 1024
+ if speed > 1024:
+ speed = f"{round(speed / 1024, 2)} M/s"
+ else:
+ speed = f"{speed} KB/s"
+ self.textEdit_download_top.append(
+ f"文件来源:{msm['info']['url']}\n文件大小:{round(msm['info']['size'] / 1024 / 1024, 2)} MB\n已经下载:{round(msm['main']['data'] / 1024 / 1024, 2)} MB\n平均速度:{speed}\n已经储存至:{msm['info']['saveTo']}\n")
+ self.progressBar_downloader_main.setValue(100)
+ elif isMutiThread == 0 and isFinished == 0:
+ ospeed = msm['main']['speed'] / 1024
+ if ospeed == 0:
+ ospeed = 1
+ if ospeed > 1024:
+ speed = f"{round(ospeed / 1024, 2)} M/s"
+ else:
+ speed = f"{ospeed} KB/s"
+ self.textEdit_download_top.append(
+ f"文件来源:{msm['info']['url']}\n文件大小:未知\n已经下载:{round(msm['main']['data'] / 1024 / 1024, 2)} MB\n传输速度:{speed}\n剩余时间:未知\n储存至:{msm['info']['saveTo']}\n")
+ # 子进度条设置进度
+ for i in range(msm['info']['thread']):
+ self.pros[i].hide()
+ # 主进度条设置进度
+ self.progressBar_downloader_main.setValue(100)
+ else:
+ # 下载完成,隐藏子进度条
+ for i in range(msm['info']['thread']):
+ self.pros[i].hide()
+ speed = isFinished / 1024
+ if speed > 1024:
+ speed = f"{round(speed / 1024, 2)} M/s"
+ else:
+ speed = f"{speed} KB/s"
+ self.textEdit_download_top.append(
+ f"文件来源:{msm['info']['url']}\n文件大小:{round(msm['main']['data'] / 1024 / 1024, 2)} MB\n已经下载:{round(msm['main']['data'] / 1024 / 1024, 2)} MB\n平均速度:{speed}\n已经储存至:{msm['info']['saveTo']}\n")
+
+
def update_thread(self, auto=True):
try:
self.update_Thread = Update_Thread(auto)
diff --git a/main_window.py b/main_window.py
index c341154..c36ddf3 100644
--- a/main_window.py
+++ b/main_window.py
@@ -16,10 +16,9 @@ def setupUi(self, MainWindow):
MainWindow.resize(1200, 741)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
- self.horizontalLayout = QtWidgets.QHBoxLayout(self.centralwidget)
- self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
- self.horizontalLayout.setSpacing(0)
- self.horizontalLayout.setObjectName("horizontalLayout")
+ self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
+ self.gridLayout.setContentsMargins(0, 0, 0, 0)
+ self.gridLayout.setObjectName("gridLayout")
self.widget = QtWidgets.QWidget(self.centralwidget)
self.widget.setObjectName("widget")
self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.widget)
@@ -28,7 +27,7 @@ def setupUi(self, MainWindow):
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.widget_menu = QtWidgets.QWidget(self.widget)
self.widget_menu.setMinimumSize(QtCore.QSize(200, 0))
- self.widget_menu.setMaximumSize(QtCore.QSize(300, 16777215))
+ self.widget_menu.setMaximumSize(QtCore.QSize(200, 16777215))
self.widget_menu.setStyleSheet("QWidget#widget_menu{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0 #4e54c8,stop:1 #8f94fb);}")
self.widget_menu.setObjectName("widget_menu")
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.widget_menu)
@@ -107,6 +106,14 @@ def setupUi(self, MainWindow):
self.pushButton_menu_api.setObjectName("pushButton_menu_api")
self.verticalLayout.addWidget(self.pushButton_menu_api)
self.verticalLayout_2.addWidget(self.widget_3)
+ self.pushButton_menu_downloader = QtWidgets.QPushButton(self.widget_menu)
+ self.pushButton_menu_downloader.setMinimumSize(QtCore.QSize(0, 50))
+ font = QtGui.QFont()
+ font.setFamily("微软雅黑")
+ self.pushButton_menu_downloader.setFont(font)
+ self.pushButton_menu_downloader.setStyleSheet("QPushButton{background:Transparent;color:white;}QPushButton:hover{background-color:rgba(0,0,0, 0.2);}")
+ self.pushButton_menu_downloader.setObjectName("pushButton_menu_downloader")
+ self.verticalLayout_2.addWidget(self.pushButton_menu_downloader)
self.pushButton_menu_about_us = QtWidgets.QPushButton(self.widget_menu)
self.pushButton_menu_about_us.setMinimumSize(QtCore.QSize(0, 50))
font = QtGui.QFont()
@@ -433,10 +440,298 @@ def setupUi(self, MainWindow):
self.verticalLayout_13.addItem(spacerItem7)
self.verticalLayout_11.addWidget(self.widget_13)
self.stackedWidget.addWidget(self.sta_start)
+ self.browser = QtWidgets.QWidget()
+ self.browser.setObjectName("browser")
+ self.verticalLayout_14 = QtWidgets.QVBoxLayout(self.browser)
+ self.verticalLayout_14.setContentsMargins(0, 0, 0, 0)
+ self.verticalLayout_14.setSpacing(0)
+ self.verticalLayout_14.setObjectName("verticalLayout_14")
+ self.widget_browser = QtWidgets.QWidget(self.browser)
+ self.widget_browser.setObjectName("widget_browser")
+ self.verticalLayout_14.addWidget(self.widget_browser)
+ self.stackedWidget.addWidget(self.browser)
+ self.downloader = QtWidgets.QWidget()
+ self.downloader.setObjectName("downloader")
+ self.horizontalLayout_13 = QtWidgets.QHBoxLayout(self.downloader)
+ self.horizontalLayout_13.setContentsMargins(0, 0, 0, 0)
+ self.horizontalLayout_13.setSpacing(0)
+ self.horizontalLayout_13.setObjectName("horizontalLayout_13")
+ self.widget_14 = QtWidgets.QWidget(self.downloader)
+ self.widget_14.setObjectName("widget_14")
+ self.verticalLayout_15 = QtWidgets.QVBoxLayout(self.widget_14)
+ self.verticalLayout_15.setContentsMargins(10, 10, 10, 10)
+ self.verticalLayout_15.setSpacing(0)
+ self.verticalLayout_15.setObjectName("verticalLayout_15")
+ self.widget_15 = QtWidgets.QWidget(self.widget_14)
+ self.widget_15.setMinimumSize(QtCore.QSize(0, 40))
+ self.widget_15.setMaximumSize(QtCore.QSize(16777215, 40))
+ self.widget_15.setObjectName("widget_15")
+ self.horizontalLayout_14 = QtWidgets.QHBoxLayout(self.widget_15)
+ self.horizontalLayout_14.setContentsMargins(10, 0, 10, 0)
+ self.horizontalLayout_14.setSpacing(0)
+ self.horizontalLayout_14.setObjectName("horizontalLayout_14")
+ self.pushButton_downloader_new = QtWidgets.QPushButton(self.widget_15)
+ self.pushButton_downloader_new.setMinimumSize(QtCore.QSize(0, 40))
+ self.pushButton_downloader_new.setMaximumSize(QtCore.QSize(666, 40))
+ font = QtGui.QFont()
+ font.setFamily("微软雅黑")
+ font.setBold(False)
+ font.setWeight(50)
+ self.pushButton_downloader_new.setFont(font)
+ self.pushButton_downloader_new.setStyleSheet("QPushButton{background:Transparent;color:blue;}QPushButton:hover{background-color:rgba(0,0,0, 0.2);}")
+ self.pushButton_downloader_new.setObjectName("pushButton_downloader_new")
+ self.horizontalLayout_14.addWidget(self.pushButton_downloader_new)
+ spacerItem8 = QtWidgets.QSpacerItem(937, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+ self.horizontalLayout_14.addItem(spacerItem8)
+ self.verticalLayout_15.addWidget(self.widget_15)
+ self.widget_16 = QtWidgets.QWidget(self.widget_14)
+ self.widget_16.setStyleSheet("QWidget#widget_16{background:Transparent;border:1px solid grey}")
+ self.widget_16.setObjectName("widget_16")
+ self.verticalLayout_16 = QtWidgets.QVBoxLayout(self.widget_16)
+ self.verticalLayout_16.setContentsMargins(0, -1, 0, -1)
+ self.verticalLayout_16.setSpacing(2)
+ self.verticalLayout_16.setObjectName("verticalLayout_16")
+ self.textEdit_download_top = QtWidgets.QTextEdit(self.widget_16)
+ self.textEdit_download_top.setMinimumSize(QtCore.QSize(0, 150))
+ self.textEdit_download_top.setMaximumSize(QtCore.QSize(16777215, 200))
+ font = QtGui.QFont()
+ font.setFamily("微软雅黑")
+ self.textEdit_download_top.setFont(font)
+ self.textEdit_download_top.setStyleSheet("QTextEdit{background:Transparent;border:0px solid grey}")
+ self.textEdit_download_top.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
+ self.textEdit_download_top.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
+ self.textEdit_download_top.setReadOnly(True)
+ self.textEdit_download_top.setObjectName("textEdit_download_top")
+ self.verticalLayout_16.addWidget(self.textEdit_download_top)
+ self.progressBar_downloader_main = QtWidgets.QProgressBar(self.widget_16)
+ self.progressBar_downloader_main.setMinimumSize(QtCore.QSize(0, 30))
+ self.progressBar_downloader_main.setMaximumSize(QtCore.QSize(16777215, 30))
+ font = QtGui.QFont()
+ font.setFamily("微软雅黑")
+ self.progressBar_downloader_main.setFont(font)
+ self.progressBar_downloader_main.setStyleSheet("QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}")
+ self.progressBar_downloader_main.setProperty("value", 0)
+ self.progressBar_downloader_main.setAlignment(QtCore.Qt.AlignCenter)
+ self.progressBar_downloader_main.setTextVisible(True)
+ self.progressBar_downloader_main.setObjectName("progressBar_downloader_main")
+ self.verticalLayout_16.addWidget(self.progressBar_downloader_main)
+ self.widget_17 = QtWidgets.QWidget(self.widget_16)
+ self.widget_17.setMaximumSize(QtCore.QSize(980, 16777215))
+ self.widget_17.setObjectName("widget_17")
+ self.horizontalLayout = QtWidgets.QHBoxLayout(self.widget_17)
+ self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
+ self.horizontalLayout.setSpacing(0)
+ self.horizontalLayout.setObjectName("horizontalLayout")
+ self.progressBar_downloader_sub0 = QtWidgets.QProgressBar(self.widget_17)
+ self.progressBar_downloader_sub0.setMinimumSize(QtCore.QSize(0, 20))
+ self.progressBar_downloader_sub0.setMaximumSize(QtCore.QSize(16777215, 20))
+ font = QtGui.QFont()
+ font.setFamily("微软雅黑")
+ self.progressBar_downloader_sub0.setFont(font)
+ self.progressBar_downloader_sub0.setStyleSheet("QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}")
+ self.progressBar_downloader_sub0.setProperty("value", 0)
+ self.progressBar_downloader_sub0.setAlignment(QtCore.Qt.AlignCenter)
+ self.progressBar_downloader_sub0.setTextVisible(False)
+ self.progressBar_downloader_sub0.setObjectName("progressBar_downloader_sub0")
+ self.horizontalLayout.addWidget(self.progressBar_downloader_sub0)
+ self.progressBar_downloader_sub1 = QtWidgets.QProgressBar(self.widget_17)
+ self.progressBar_downloader_sub1.setMinimumSize(QtCore.QSize(0, 20))
+ self.progressBar_downloader_sub1.setMaximumSize(QtCore.QSize(16777215, 20))
+ font = QtGui.QFont()
+ font.setFamily("微软雅黑")
+ self.progressBar_downloader_sub1.setFont(font)
+ self.progressBar_downloader_sub1.setStyleSheet("QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}")
+ self.progressBar_downloader_sub1.setProperty("value", 0)
+ self.progressBar_downloader_sub1.setAlignment(QtCore.Qt.AlignCenter)
+ self.progressBar_downloader_sub1.setTextVisible(False)
+ self.progressBar_downloader_sub1.setObjectName("progressBar_downloader_sub1")
+ self.horizontalLayout.addWidget(self.progressBar_downloader_sub1)
+ self.progressBar_downloader_sub2 = QtWidgets.QProgressBar(self.widget_17)
+ self.progressBar_downloader_sub2.setMinimumSize(QtCore.QSize(0, 20))
+ self.progressBar_downloader_sub2.setMaximumSize(QtCore.QSize(16777215, 20))
+ font = QtGui.QFont()
+ font.setFamily("微软雅黑")
+ self.progressBar_downloader_sub2.setFont(font)
+ self.progressBar_downloader_sub2.setStyleSheet("QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}")
+ self.progressBar_downloader_sub2.setProperty("value", 0)
+ self.progressBar_downloader_sub2.setAlignment(QtCore.Qt.AlignCenter)
+ self.progressBar_downloader_sub2.setTextVisible(False)
+ self.progressBar_downloader_sub2.setObjectName("progressBar_downloader_sub2")
+ self.horizontalLayout.addWidget(self.progressBar_downloader_sub2)
+ self.progressBar_downloader_sub3 = QtWidgets.QProgressBar(self.widget_17)
+ self.progressBar_downloader_sub3.setMinimumSize(QtCore.QSize(0, 20))
+ self.progressBar_downloader_sub3.setMaximumSize(QtCore.QSize(16777215, 20))
+ font = QtGui.QFont()
+ font.setFamily("微软雅黑")
+ self.progressBar_downloader_sub3.setFont(font)
+ self.progressBar_downloader_sub3.setStyleSheet("QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}")
+ self.progressBar_downloader_sub3.setProperty("value", 0)
+ self.progressBar_downloader_sub3.setAlignment(QtCore.Qt.AlignCenter)
+ self.progressBar_downloader_sub3.setTextVisible(False)
+ self.progressBar_downloader_sub3.setObjectName("progressBar_downloader_sub3")
+ self.horizontalLayout.addWidget(self.progressBar_downloader_sub3)
+ self.progressBar_downloader_sub4 = QtWidgets.QProgressBar(self.widget_17)
+ self.progressBar_downloader_sub4.setMinimumSize(QtCore.QSize(0, 20))
+ self.progressBar_downloader_sub4.setMaximumSize(QtCore.QSize(16777215, 20))
+ font = QtGui.QFont()
+ font.setFamily("微软雅黑")
+ self.progressBar_downloader_sub4.setFont(font)
+ self.progressBar_downloader_sub4.setStyleSheet("QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}")
+ self.progressBar_downloader_sub4.setProperty("value", 0)
+ self.progressBar_downloader_sub4.setAlignment(QtCore.Qt.AlignCenter)
+ self.progressBar_downloader_sub4.setTextVisible(False)
+ self.progressBar_downloader_sub4.setObjectName("progressBar_downloader_sub4")
+ self.horizontalLayout.addWidget(self.progressBar_downloader_sub4)
+ self.progressBar_downloader_sub5 = QtWidgets.QProgressBar(self.widget_17)
+ self.progressBar_downloader_sub5.setMinimumSize(QtCore.QSize(0, 20))
+ self.progressBar_downloader_sub5.setMaximumSize(QtCore.QSize(16777215, 20))
+ font = QtGui.QFont()
+ font.setFamily("微软雅黑")
+ self.progressBar_downloader_sub5.setFont(font)
+ self.progressBar_downloader_sub5.setStyleSheet("QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}")
+ self.progressBar_downloader_sub5.setProperty("value", 0)
+ self.progressBar_downloader_sub5.setAlignment(QtCore.Qt.AlignCenter)
+ self.progressBar_downloader_sub5.setTextVisible(False)
+ self.progressBar_downloader_sub5.setObjectName("progressBar_downloader_sub5")
+ self.horizontalLayout.addWidget(self.progressBar_downloader_sub5)
+ self.progressBar_downloader_sub6 = QtWidgets.QProgressBar(self.widget_17)
+ self.progressBar_downloader_sub6.setMinimumSize(QtCore.QSize(0, 20))
+ self.progressBar_downloader_sub6.setMaximumSize(QtCore.QSize(16777215, 20))
+ font = QtGui.QFont()
+ font.setFamily("微软雅黑")
+ self.progressBar_downloader_sub6.setFont(font)
+ self.progressBar_downloader_sub6.setStyleSheet("QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}")
+ self.progressBar_downloader_sub6.setProperty("value", 0)
+ self.progressBar_downloader_sub6.setAlignment(QtCore.Qt.AlignCenter)
+ self.progressBar_downloader_sub6.setTextVisible(False)
+ self.progressBar_downloader_sub6.setObjectName("progressBar_downloader_sub6")
+ self.horizontalLayout.addWidget(self.progressBar_downloader_sub6)
+ self.progressBar_downloader_sub7 = QtWidgets.QProgressBar(self.widget_17)
+ self.progressBar_downloader_sub7.setMinimumSize(QtCore.QSize(0, 20))
+ self.progressBar_downloader_sub7.setMaximumSize(QtCore.QSize(16777215, 20))
+ font = QtGui.QFont()
+ font.setFamily("微软雅黑")
+ self.progressBar_downloader_sub7.setFont(font)
+ self.progressBar_downloader_sub7.setStyleSheet("QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}")
+ self.progressBar_downloader_sub7.setProperty("value", 0)
+ self.progressBar_downloader_sub7.setAlignment(QtCore.Qt.AlignCenter)
+ self.progressBar_downloader_sub7.setTextVisible(False)
+ self.progressBar_downloader_sub7.setObjectName("progressBar_downloader_sub7")
+ self.horizontalLayout.addWidget(self.progressBar_downloader_sub7)
+ self.progressBar_downloader_sub8 = QtWidgets.QProgressBar(self.widget_17)
+ self.progressBar_downloader_sub8.setMinimumSize(QtCore.QSize(0, 20))
+ self.progressBar_downloader_sub8.setMaximumSize(QtCore.QSize(16777215, 20))
+ font = QtGui.QFont()
+ font.setFamily("微软雅黑")
+ self.progressBar_downloader_sub8.setFont(font)
+ self.progressBar_downloader_sub8.setStyleSheet("QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}")
+ self.progressBar_downloader_sub8.setProperty("value", 0)
+ self.progressBar_downloader_sub8.setAlignment(QtCore.Qt.AlignCenter)
+ self.progressBar_downloader_sub8.setTextVisible(False)
+ self.progressBar_downloader_sub8.setObjectName("progressBar_downloader_sub8")
+ self.horizontalLayout.addWidget(self.progressBar_downloader_sub8)
+ self.progressBar_downloader_sub9 = QtWidgets.QProgressBar(self.widget_17)
+ self.progressBar_downloader_sub9.setMinimumSize(QtCore.QSize(0, 20))
+ self.progressBar_downloader_sub9.setMaximumSize(QtCore.QSize(16777215, 20))
+ font = QtGui.QFont()
+ font.setFamily("微软雅黑")
+ self.progressBar_downloader_sub9.setFont(font)
+ self.progressBar_downloader_sub9.setStyleSheet("QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}")
+ self.progressBar_downloader_sub9.setProperty("value", 0)
+ self.progressBar_downloader_sub9.setAlignment(QtCore.Qt.AlignCenter)
+ self.progressBar_downloader_sub9.setTextVisible(False)
+ self.progressBar_downloader_sub9.setObjectName("progressBar_downloader_sub9")
+ self.horizontalLayout.addWidget(self.progressBar_downloader_sub9)
+ self.progressBar_downloader_sub10 = QtWidgets.QProgressBar(self.widget_17)
+ self.progressBar_downloader_sub10.setMinimumSize(QtCore.QSize(0, 20))
+ self.progressBar_downloader_sub10.setMaximumSize(QtCore.QSize(16777215, 20))
+ font = QtGui.QFont()
+ font.setFamily("微软雅黑")
+ self.progressBar_downloader_sub10.setFont(font)
+ self.progressBar_downloader_sub10.setStyleSheet("QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}")
+ self.progressBar_downloader_sub10.setProperty("value", 0)
+ self.progressBar_downloader_sub10.setAlignment(QtCore.Qt.AlignCenter)
+ self.progressBar_downloader_sub10.setTextVisible(False)
+ self.progressBar_downloader_sub10.setObjectName("progressBar_downloader_sub10")
+ self.horizontalLayout.addWidget(self.progressBar_downloader_sub10)
+ self.progressBar_downloader_sub11 = QtWidgets.QProgressBar(self.widget_17)
+ self.progressBar_downloader_sub11.setMinimumSize(QtCore.QSize(0, 20))
+ self.progressBar_downloader_sub11.setMaximumSize(QtCore.QSize(16777215, 20))
+ font = QtGui.QFont()
+ font.setFamily("微软雅黑")
+ self.progressBar_downloader_sub11.setFont(font)
+ self.progressBar_downloader_sub11.setStyleSheet("QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}")
+ self.progressBar_downloader_sub11.setProperty("value", 0)
+ self.progressBar_downloader_sub11.setAlignment(QtCore.Qt.AlignCenter)
+ self.progressBar_downloader_sub11.setTextVisible(False)
+ self.progressBar_downloader_sub11.setObjectName("progressBar_downloader_sub11")
+ self.horizontalLayout.addWidget(self.progressBar_downloader_sub11)
+ self.progressBar_downloader_sub12 = QtWidgets.QProgressBar(self.widget_17)
+ self.progressBar_downloader_sub12.setMinimumSize(QtCore.QSize(0, 20))
+ self.progressBar_downloader_sub12.setMaximumSize(QtCore.QSize(16777215, 20))
+ font = QtGui.QFont()
+ font.setFamily("微软雅黑")
+ self.progressBar_downloader_sub12.setFont(font)
+ self.progressBar_downloader_sub12.setStyleSheet("QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}")
+ self.progressBar_downloader_sub12.setProperty("value", 0)
+ self.progressBar_downloader_sub12.setAlignment(QtCore.Qt.AlignCenter)
+ self.progressBar_downloader_sub12.setTextVisible(False)
+ self.progressBar_downloader_sub12.setObjectName("progressBar_downloader_sub12")
+ self.horizontalLayout.addWidget(self.progressBar_downloader_sub12)
+ self.progressBar_downloader_sub13 = QtWidgets.QProgressBar(self.widget_17)
+ self.progressBar_downloader_sub13.setMinimumSize(QtCore.QSize(0, 20))
+ self.progressBar_downloader_sub13.setMaximumSize(QtCore.QSize(16777215, 20))
+ font = QtGui.QFont()
+ font.setFamily("微软雅黑")
+ self.progressBar_downloader_sub13.setFont(font)
+ self.progressBar_downloader_sub13.setStyleSheet("QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}")
+ self.progressBar_downloader_sub13.setProperty("value", 0)
+ self.progressBar_downloader_sub13.setAlignment(QtCore.Qt.AlignCenter)
+ self.progressBar_downloader_sub13.setTextVisible(False)
+ self.progressBar_downloader_sub13.setObjectName("progressBar_downloader_sub13")
+ self.horizontalLayout.addWidget(self.progressBar_downloader_sub13)
+ self.progressBar_downloader_sub14 = QtWidgets.QProgressBar(self.widget_17)
+ self.progressBar_downloader_sub14.setMinimumSize(QtCore.QSize(0, 20))
+ self.progressBar_downloader_sub14.setMaximumSize(QtCore.QSize(16777215, 20))
+ font = QtGui.QFont()
+ font.setFamily("微软雅黑")
+ self.progressBar_downloader_sub14.setFont(font)
+ self.progressBar_downloader_sub14.setStyleSheet("QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}")
+ self.progressBar_downloader_sub14.setProperty("value", 0)
+ self.progressBar_downloader_sub14.setAlignment(QtCore.Qt.AlignCenter)
+ self.progressBar_downloader_sub14.setTextVisible(False)
+ self.progressBar_downloader_sub14.setObjectName("progressBar_downloader_sub14")
+ self.horizontalLayout.addWidget(self.progressBar_downloader_sub14)
+ self.progressBar_downloader_sub15 = QtWidgets.QProgressBar(self.widget_17)
+ self.progressBar_downloader_sub15.setMinimumSize(QtCore.QSize(0, 20))
+ self.progressBar_downloader_sub15.setMaximumSize(QtCore.QSize(16777215, 20))
+ font = QtGui.QFont()
+ font.setFamily("微软雅黑")
+ self.progressBar_downloader_sub15.setFont(font)
+ self.progressBar_downloader_sub15.setStyleSheet("QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}")
+ self.progressBar_downloader_sub15.setProperty("value", 0)
+ self.progressBar_downloader_sub15.setAlignment(QtCore.Qt.AlignCenter)
+ self.progressBar_downloader_sub15.setTextVisible(False)
+ self.progressBar_downloader_sub15.setObjectName("progressBar_downloader_sub15")
+ self.horizontalLayout.addWidget(self.progressBar_downloader_sub15)
+ self.verticalLayout_16.addWidget(self.widget_17)
+ self.textEdit_download_sub = QtWidgets.QTextEdit(self.widget_16)
+ font = QtGui.QFont()
+ font.setFamily("微软雅黑")
+ self.textEdit_download_sub.setFont(font)
+ self.textEdit_download_sub.setStyleSheet("QTextEdit{background:Transparent;border:0px solid grey}")
+ self.textEdit_download_sub.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
+ self.textEdit_download_sub.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
+ self.textEdit_download_sub.setReadOnly(True)
+ self.textEdit_download_sub.setObjectName("textEdit_download_sub")
+ self.verticalLayout_16.addWidget(self.textEdit_download_sub)
+ self.verticalLayout_15.addWidget(self.widget_16)
+ self.horizontalLayout_13.addWidget(self.widget_14)
+ self.stackedWidget.addWidget(self.downloader)
self.horizontalLayout_6.addWidget(self.stackedWidget)
self.verticalLayout_3.addWidget(self.widget_5)
self.horizontalLayout_2.addWidget(self.widget_main)
- self.horizontalLayout.addWidget(self.widget)
+ self.gridLayout.addWidget(self.widget, 0, 0, 1, 1)
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
@@ -450,6 +745,7 @@ def retranslateUi(self, MainWindow):
self.pushButton_menu_source.setText(_translate("MainWindow", " 源码仓库"))
self.pushButton_menu_article.setText(_translate("MainWindow", " 文章教程"))
self.pushButton_menu_api.setText(_translate("MainWindow", " 接口文档"))
+ self.pushButton_menu_downloader.setText(_translate("MainWindow", " 下载管理"))
self.pushButton_menu_about_us.setText(_translate("MainWindow", " 关于我们"))
self.label_sys_info.setText(_translate("MainWindow", "00:00:00"))
self.pushButton_feedback.setToolTip(_translate("MainWindow", "反馈与建议
"))
@@ -467,6 +763,25 @@ def retranslateUi(self, MainWindow):
self.pushButton_web_rights.setText(_translate("MainWindow", "用户协议"))
self.pushButton_help_us.setText(_translate("MainWindow", "支持我们"))
self.label_5.setText(_translate("MainWindow", "Copyright © 2020 Toodo.fun. All Rights Reserved."))
- self.label_welcome.setText(_translate("MainWindow", "初逢不知人如玉,再逢已是意中人"))
+ self.label_welcome.setText(_translate("MainWindow", "我自是年少,韶华倾负"))
self.label_time.setText(_translate("MainWindow", "TextLabel"))
+ self.pushButton_downloader_new.setToolTip(_translate("MainWindow", "新建下载
"))
+ self.pushButton_downloader_new.setText(_translate("MainWindow", "新建下载"))
+ self.progressBar_downloader_main.setFormat(_translate("MainWindow", "%p%"))
+ self.progressBar_downloader_sub0.setFormat(_translate("MainWindow", "线程1"))
+ self.progressBar_downloader_sub1.setFormat(_translate("MainWindow", "线程2"))
+ self.progressBar_downloader_sub2.setFormat(_translate("MainWindow", "线程3"))
+ self.progressBar_downloader_sub3.setFormat(_translate("MainWindow", "线程4"))
+ self.progressBar_downloader_sub4.setFormat(_translate("MainWindow", "线程5"))
+ self.progressBar_downloader_sub5.setFormat(_translate("MainWindow", "线程6"))
+ self.progressBar_downloader_sub6.setFormat(_translate("MainWindow", "线程7"))
+ self.progressBar_downloader_sub7.setFormat(_translate("MainWindow", "线程8"))
+ self.progressBar_downloader_sub8.setFormat(_translate("MainWindow", "线程9"))
+ self.progressBar_downloader_sub9.setFormat(_translate("MainWindow", "线程10"))
+ self.progressBar_downloader_sub10.setFormat(_translate("MainWindow", "线程11"))
+ self.progressBar_downloader_sub11.setFormat(_translate("MainWindow", "线程12"))
+ self.progressBar_downloader_sub12.setFormat(_translate("MainWindow", "线程13"))
+ self.progressBar_downloader_sub13.setFormat(_translate("MainWindow", "线程14"))
+ self.progressBar_downloader_sub14.setFormat(_translate("MainWindow", "线程15"))
+ self.progressBar_downloader_sub15.setFormat(_translate("MainWindow", "%p%"))
import resources_rc
diff --git a/main_window.ui b/main_window.ui
index 1f33acd..575c3cd 100644
--- a/main_window.ui
+++ b/main_window.ui
@@ -14,10 +14,7 @@
MainWindow
-
-
- 0
-
+
0
@@ -30,7 +27,7 @@
0
- -
+
-
@@ -58,7 +55,7 @@
- 300
+ 200
16777215
@@ -243,6 +240,27 @@
+ -
+
+
+
+ 0
+ 50
+
+
+
+
+ 微软雅黑
+
+
+
+ QPushButton{background:Transparent;color:white;}QPushButton:hover{background-color:rgba(0,0,0, 0.2);}
+
+
+ 下载管理
+
+
+
-
@@ -1042,7 +1060,7 @@
- 初逢不知人如玉,再逢已是意中人
+ 我自是年少,韶华倾负
Qt::AlignCenter
@@ -1083,6 +1101,857 @@
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+ -
+
+
+
+
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+ -
+
+
+
+ 0
+
+
+ 10
+
+
+ 10
+
+
+ 10
+
+
+ 10
+
+
-
+
+
+
+ 0
+ 40
+
+
+
+
+ 16777215
+ 40
+
+
+
+
+ 0
+
+
+ 10
+
+
+ 0
+
+
+ 10
+
+
+ 0
+
+
-
+
+
+
+ 0
+ 40
+
+
+
+
+ 666
+ 40
+
+
+
+
+ 微软雅黑
+ 50
+ false
+
+
+
+ <html><head/><body><p>新建下载</p></body></html>
+
+
+ QPushButton{background:Transparent;color:blue;}QPushButton:hover{background-color:rgba(0,0,0, 0.2);}
+
+
+ 新建下载
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 937
+ 20
+
+
+
+
+
+
+
+ -
+
+
+ QWidget#widget_16{background:Transparent;border:1px solid grey}
+
+
+
+ 2
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+
+ 0
+ 150
+
+
+
+
+ 16777215
+ 200
+
+
+
+
+ 微软雅黑
+
+
+
+ QTextEdit{background:Transparent;border:0px solid grey}
+
+
+ Qt::ScrollBarAlwaysOff
+
+
+ Qt::ScrollBarAlwaysOff
+
+
+ true
+
+
+
+ -
+
+
+
+ 0
+ 30
+
+
+
+
+ 16777215
+ 30
+
+
+
+
+ 微软雅黑
+
+
+
+ QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}
+
+
+ 0
+
+
+ Qt::AlignCenter
+
+
+ true
+
+
+ %p%
+
+
+
+ -
+
+
+
+ 980
+ 16777215
+
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+
+ 0
+ 20
+
+
+
+
+ 16777215
+ 20
+
+
+
+
+ 微软雅黑
+
+
+
+ QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}
+
+
+ 0
+
+
+ Qt::AlignCenter
+
+
+ false
+
+
+ 线程1
+
+
+
+ -
+
+
+
+ 0
+ 20
+
+
+
+
+ 16777215
+ 20
+
+
+
+
+ 微软雅黑
+
+
+
+ QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}
+
+
+ 0
+
+
+ Qt::AlignCenter
+
+
+ false
+
+
+ 线程2
+
+
+
+ -
+
+
+
+ 0
+ 20
+
+
+
+
+ 16777215
+ 20
+
+
+
+
+ 微软雅黑
+
+
+
+ QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}
+
+
+ 0
+
+
+ Qt::AlignCenter
+
+
+ false
+
+
+ 线程3
+
+
+
+ -
+
+
+
+ 0
+ 20
+
+
+
+
+ 16777215
+ 20
+
+
+
+
+ 微软雅黑
+
+
+
+ QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}
+
+
+ 0
+
+
+ Qt::AlignCenter
+
+
+ false
+
+
+ 线程4
+
+
+
+ -
+
+
+
+ 0
+ 20
+
+
+
+
+ 16777215
+ 20
+
+
+
+
+ 微软雅黑
+
+
+
+ QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}
+
+
+ 0
+
+
+ Qt::AlignCenter
+
+
+ false
+
+
+ 线程5
+
+
+
+ -
+
+
+
+ 0
+ 20
+
+
+
+
+ 16777215
+ 20
+
+
+
+
+ 微软雅黑
+
+
+
+ QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}
+
+
+ 0
+
+
+ Qt::AlignCenter
+
+
+ false
+
+
+ 线程6
+
+
+
+ -
+
+
+
+ 0
+ 20
+
+
+
+
+ 16777215
+ 20
+
+
+
+
+ 微软雅黑
+
+
+
+ QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}
+
+
+ 0
+
+
+ Qt::AlignCenter
+
+
+ false
+
+
+ 线程7
+
+
+
+ -
+
+
+
+ 0
+ 20
+
+
+
+
+ 16777215
+ 20
+
+
+
+
+ 微软雅黑
+
+
+
+ QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}
+
+
+ 0
+
+
+ Qt::AlignCenter
+
+
+ false
+
+
+ 线程8
+
+
+
+ -
+
+
+
+ 0
+ 20
+
+
+
+
+ 16777215
+ 20
+
+
+
+
+ 微软雅黑
+
+
+
+ QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}
+
+
+ 0
+
+
+ Qt::AlignCenter
+
+
+ false
+
+
+ 线程9
+
+
+
+ -
+
+
+
+ 0
+ 20
+
+
+
+
+ 16777215
+ 20
+
+
+
+
+ 微软雅黑
+
+
+
+ QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}
+
+
+ 0
+
+
+ Qt::AlignCenter
+
+
+ false
+
+
+ 线程10
+
+
+
+ -
+
+
+
+ 0
+ 20
+
+
+
+
+ 16777215
+ 20
+
+
+
+
+ 微软雅黑
+
+
+
+ QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}
+
+
+ 0
+
+
+ Qt::AlignCenter
+
+
+ false
+
+
+ 线程11
+
+
+
+ -
+
+
+
+ 0
+ 20
+
+
+
+
+ 16777215
+ 20
+
+
+
+
+ 微软雅黑
+
+
+
+ QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}
+
+
+ 0
+
+
+ Qt::AlignCenter
+
+
+ false
+
+
+ 线程12
+
+
+
+ -
+
+
+
+ 0
+ 20
+
+
+
+
+ 16777215
+ 20
+
+
+
+
+ 微软雅黑
+
+
+
+ QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}
+
+
+ 0
+
+
+ Qt::AlignCenter
+
+
+ false
+
+
+ 线程13
+
+
+
+ -
+
+
+
+ 0
+ 20
+
+
+
+
+ 16777215
+ 20
+
+
+
+
+ 微软雅黑
+
+
+
+ QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}
+
+
+ 0
+
+
+ Qt::AlignCenter
+
+
+ false
+
+
+ 线程14
+
+
+
+ -
+
+
+
+ 0
+ 20
+
+
+
+
+ 16777215
+ 20
+
+
+
+
+ 微软雅黑
+
+
+
+ QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}
+
+
+ 0
+
+
+ Qt::AlignCenter
+
+
+ false
+
+
+ 线程15
+
+
+
+ -
+
+
+
+ 0
+ 20
+
+
+
+
+ 16777215
+ 20
+
+
+
+
+ 微软雅黑
+
+
+
+ QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}
+
+
+ 0
+
+
+ Qt::AlignCenter
+
+
+ false
+
+
+ %p%
+
+
+
+
+
+
+ -
+
+
+
+ 微软雅黑
+
+
+
+ QTextEdit{background:Transparent;border:0px solid grey}
+
+
+ Qt::ScrollBarAlwaysOff
+
+
+ Qt::ScrollBarAlwaysOff
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soft_cfg.py b/soft_cfg.py
index bc4844f..65b2a4c 100644
--- a/soft_cfg.py
+++ b/soft_cfg.py
@@ -1,6 +1,6 @@
import json
-version = 1.1
+version = 1.2
name = "但行趣事管家.exe"
# 定义网址
From bc2049299fad267d4d2418d4b1ba717af5ff2b2c Mon Sep 17 00:00:00 2001
From: Rui Ma
Date: Wed, 6 May 2020 21:07:27 +0800
Subject: [PATCH 02/11] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=8B=E8=BD=BD?=
=?UTF-8?q?=E4=B8=AD=E7=9A=84BUG?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
修复下载中的BUG
---
.idea/workspace.xml | 32 +++++++++++++-------------
Sub_Thread.py | 55 +++++++++++++++++++++++++++++++++------------
function.py | 7 ++++++
3 files changed, 64 insertions(+), 30 deletions(-)
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index a111f90..45cfce0 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -177,50 +177,50 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
+
diff --git a/Sub_Thread.py b/Sub_Thread.py
index 97799a4..7a03bb6 100644
--- a/Sub_Thread.py
+++ b/Sub_Thread.py
@@ -112,6 +112,7 @@ def __init__(self, choose, url, saveFile, start, end, threadId, chunkSize=10240)
self.dend = end
self.threadId = threadId
self.chunkSize = chunkSize
+ self.runFlag = 0
def run(self):
if self.choose == 1:
@@ -119,6 +120,9 @@ def run(self):
else:
self.run_special()
+ def stop(self):
+ self.runFlag = 1
+
def run_normal(self):
start = self.dstart
end = self.dend
@@ -126,7 +130,7 @@ def run_normal(self):
chunkSize = self.chunkSize
for _ in range(30):
try:
- headers = {'Range': f'bytes={start}-{end}'}
+ headers = {'Range': f'bytes={start}-{end}', "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36"}
req = requests.get(self.url, headers=headers, timeout=5, stream=True)
subSize = 0
with open(self.saveFile, 'rb+') as fo:
@@ -137,6 +141,8 @@ def run_normal(self):
start += chunkSize
subSize += chunkSize
self.thread_signal.emit(threadId)
+ if self.runFlag == 1:
+ return
return
except Exception as e:
@@ -149,9 +155,9 @@ def run_special(self):
chunkSize = self.chunkSize
for _ in range(15):
try:
- req = requests.get(self.url, timeout=30, stream=True)
+ req = requests.get(self.url, timeout=30, headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36"}, stream=True)
subSize = 0
- with open(self.saveFile, 'rb+') as fo:
+ with open(self.saveFile, 'wb') as fo:
fo.seek(start)
for chunk in req.iter_content(chunk_size=chunkSize):
if chunk:
@@ -159,7 +165,9 @@ def run_special(self):
start += chunkSize
subSize += chunkSize
self.thread_signal.emit(threadId)
-
+ if self.runFlag == 1:
+ return
+ self.thread_signal.emit(99999)
return
except Exception as e:
print(f"Download_Thread: {e}")
@@ -174,6 +182,7 @@ def __init__(self, url, threadNum, saveFile):
self.url = url
self.threadNum = threadNum
self.saveFile = saveFile
+ self.runFlag = 0
self.feedback = {
'info': {
'size': 0,
@@ -182,7 +191,8 @@ def __init__(self, url, threadNum, saveFile):
'downloader': 1,
'started': 0,
'averageSpeed': 0,
- 'thread': self.threadNum
+ 'thread': self.threadNum,
+ 'specialCode': 0
},
'main': {
'data': 0,
@@ -195,21 +205,29 @@ def __init__(self, url, threadNum, saveFile):
}
self.threads = {}
- # 302迭代寻址
- req = requests.head(self.url)
- while req.status_code == 302:
- self.url = req.headers['Location']
- self.feedback['info']['url'] = self.url
-
def run(self):
if os.path.exists(self.saveFile):
self.thread_signal.emit({'fileExists': 1, 'filePath': self.saveFile})
else:
+ # 302迭代寻址
+ req = requests.head(self.url, headers={
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36"})
+ while req.status_code == 302:
+ self.url = req.headers['Location']
+ self.feedback['info']['url'] = self.url
+ req = requests.head(self.url, headers={
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36"})
+ print(self.url)
try:
self.runDownloaderNormal()
except:
self.downloaderSpecial()
+ def stop(self):
+ for i in self.threads:
+ i.stop()
+ self.runFlag = 1
+
def downloaderNormal(self, start, end, threadId, chunkSize=10240):
self.threads[f'thread{threadId}'] = DownloaderNornal(1, self.url, self.saveFile, start, end, threadId)
self.threads[f'thread{threadId}'].thread_signal.connect(self.resizeThread)
@@ -219,13 +237,15 @@ def resizeThread(self, threadId):
chunkSize = 10240
if threadId == 99:
self.feedback['main']['data'] += chunkSize
+ elif threadId == 99999:
+ self.feedback['info']['specialCode'] = 1
else:
self.feedback['main']['data'] += chunkSize
self.feedback['sub']['data'][threadId][0] += chunkSize
self.feedback['sub']['stat'][threadId] = 1
def runDownloaderNormal(self):
- req = requests.head(self.url)
+ req = requests.head(self.url, headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36"})
self.feedback['info']['size'] = int(req.headers['Content-Length'])
self.thread_signal.emit(self.feedback)
# 初始化下载文件, 创建一个与文件大小相同的空间
@@ -253,16 +273,23 @@ def downloaderSpecial(self, chunkSize=10240):
self.sendSignal()
def sendSignal(self):
- while True:
+ while self.runFlag == 0:
savedData = self.feedback['main']['data']
time.sleep(.5)
speed = (self.feedback['main']['data'] - savedData) * 2
self.feedback['main']['speed'] = speed
self.thread_signal.emit(self.feedback)
- if self.feedback['main']['data'] >= self.feedback['info']['size']:
+ if self.feedback['main']['data'] >= self.feedback['info']['size'] and self.feedback['info']['downloader'] == 1:
self.feedback['main']['data'] = self.feedback['info']['size']
endTime = time.time()
speed = self.feedback['info']['size'] / (endTime - self.startTime)
self.feedback['info']['averageSpeed'] = speed
self.thread_signal.emit(self.feedback)
break
+ elif self.feedback['info']['downloader'] == 0 and self.feedback['info']['specialCode'] == 1:
+ self.feedback['info']['size'] = self.feedback['main']['data']
+ endTime = time.time()
+ speed = self.feedback['info']['size'] / (endTime - self.startTime)
+ self.feedback['info']['averageSpeed'] = speed
+ self.thread_signal.emit(self.feedback)
+ break
diff --git a/function.py b/function.py
index aca5189..7cfb3bf 100644
--- a/function.py
+++ b/function.py
@@ -290,7 +290,14 @@ def download_thread(self, msm):
thread = msm[1]
fileName = msm[2]
self.progressBar_downloader_main.show()
+ self.textEdit_download_top.clear()
+ self.textEdit_download_sub.clear()
self.textEdit_download_sub.show()
+ try:
+ self.download_Thread.stop()
+ self.download_Thread.thread_signal.disconnect()
+ except:
+ pass
self.download_Thread = Download_Thread(url, thread, fileName)
self.download_Thread.thread_signal.connect(self.downloadThread)
self.download_Thread.start()
From acfb88b7f83f822ec8558ba308d7c3533e5a66ed Mon Sep 17 00:00:00 2001
From: Rui Ma
Date: Sat, 9 May 2020 14:07:25 +0800
Subject: [PATCH 03/11] Update workspace.xml
---
.idea/workspace.xml | 48 ++++++++++++++++++++++-----------------------
1 file changed, 24 insertions(+), 24 deletions(-)
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 45cfce0..fb44377 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -35,7 +35,7 @@
-
+
@@ -78,7 +78,7 @@
-
+
@@ -90,7 +90,7 @@
-
+
@@ -99,7 +99,7 @@
-
+
@@ -111,7 +111,7 @@
-
+
@@ -143,11 +143,11 @@
+
-
@@ -169,58 +169,58 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
+
From 7f56e720f85792c4f61cdcb2f2b8e362a7ec8e71 Mon Sep 17 00:00:00 2001
From: Rui Ma
Date: Sat, 9 May 2020 14:20:01 +0800
Subject: [PATCH 04/11] =?UTF-8?q?=E5=8E=BB=E9=99=A4=E4=BA=86=E4=B8=8B?=
=?UTF-8?q?=E8=BD=BD=E5=99=A8=E6=A8=A1=E5=9D=97?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
去除了下载器模块
---
.idea/workspace.xml | 20 +-
Sub_Thread.py | 197 ------------
function.py | 153 +---------
main_window.py | 260 +---------------
main_window.ui | 720 +-------------------------------------------
5 files changed, 19 insertions(+), 1331 deletions(-)
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index fb44377..18c8f3e 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -35,7 +35,7 @@
-
+
@@ -143,9 +143,9 @@
+
-
@@ -177,32 +177,32 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
diff --git a/Sub_Thread.py b/Sub_Thread.py
index 7a03bb6..2d26295 100644
--- a/Sub_Thread.py
+++ b/Sub_Thread.py
@@ -1,5 +1,3 @@
-import os
-
from PyQt5.QtCore import QThread, pyqtSignal
import time
import requests
@@ -98,198 +96,3 @@ def run(self):
else:
result["auto"] = False
self.display_signal.emit(result)
-
-
-class DownloaderNornal(QThread):
- thread_signal = pyqtSignal(int)
-
- def __init__(self, choose, url, saveFile, start, end, threadId, chunkSize=10240):
- super().__init__()
- self.choose = choose
- self.saveFile = saveFile
- self.url = url
- self.dstart = start
- self.dend = end
- self.threadId = threadId
- self.chunkSize = chunkSize
- self.runFlag = 0
-
- def run(self):
- if self.choose == 1:
- self.run_normal()
- else:
- self.run_special()
-
- def stop(self):
- self.runFlag = 1
-
- def run_normal(self):
- start = self.dstart
- end = self.dend
- threadId = self.threadId
- chunkSize = self.chunkSize
- for _ in range(30):
- try:
- headers = {'Range': f'bytes={start}-{end}', "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36"}
- req = requests.get(self.url, headers=headers, timeout=5, stream=True)
- subSize = 0
- with open(self.saveFile, 'rb+') as fo:
- fo.seek(start)
- for chunk in req.iter_content(chunk_size=chunkSize):
- if chunk:
- fo.write(chunk)
- start += chunkSize
- subSize += chunkSize
- self.thread_signal.emit(threadId)
- if self.runFlag == 1:
- return
-
- return
- except Exception as e:
- print(f"Download_Thread: {e}")
-
- def run_special(self):
- start = self.dstart
- end = self.dend
- threadId = self.threadId
- chunkSize = self.chunkSize
- for _ in range(15):
- try:
- req = requests.get(self.url, timeout=30, headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36"}, stream=True)
- subSize = 0
- with open(self.saveFile, 'wb') as fo:
- fo.seek(start)
- for chunk in req.iter_content(chunk_size=chunkSize):
- if chunk:
- fo.write(chunk)
- start += chunkSize
- subSize += chunkSize
- self.thread_signal.emit(threadId)
- if self.runFlag == 1:
- return
- self.thread_signal.emit(99999)
- return
- except Exception as e:
- print(f"Download_Thread: {e}")
-
-
-class Download_Thread(QThread):
- thread_signal = pyqtSignal(dict)
-
- def __init__(self, url, threadNum, saveFile):
- super().__init__()
- self.startTime = time.time()
- self.url = url
- self.threadNum = threadNum
- self.saveFile = saveFile
- self.runFlag = 0
- self.feedback = {
- 'info': {
- 'size': 0,
- 'url': self.url,
- 'saveTo': self.saveFile,
- 'downloader': 1,
- 'started': 0,
- 'averageSpeed': 0,
- 'thread': self.threadNum,
- 'specialCode': 0
- },
- 'main': {
- 'data': 0,
- 'speed': 0,
- },
- 'sub': {
- 'data': [[0, 0] for i in range(self.threadNum)],
- 'stat': [1 for i in range(self.threadNum)]
- }
- }
- self.threads = {}
-
- def run(self):
- if os.path.exists(self.saveFile):
- self.thread_signal.emit({'fileExists': 1, 'filePath': self.saveFile})
- else:
- # 302迭代寻址
- req = requests.head(self.url, headers={
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36"})
- while req.status_code == 302:
- self.url = req.headers['Location']
- self.feedback['info']['url'] = self.url
- req = requests.head(self.url, headers={
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36"})
- print(self.url)
- try:
- self.runDownloaderNormal()
- except:
- self.downloaderSpecial()
-
- def stop(self):
- for i in self.threads:
- i.stop()
- self.runFlag = 1
-
- def downloaderNormal(self, start, end, threadId, chunkSize=10240):
- self.threads[f'thread{threadId}'] = DownloaderNornal(1, self.url, self.saveFile, start, end, threadId)
- self.threads[f'thread{threadId}'].thread_signal.connect(self.resizeThread)
- self.threads[f'thread{threadId}'].start()
-
- def resizeThread(self, threadId):
- chunkSize = 10240
- if threadId == 99:
- self.feedback['main']['data'] += chunkSize
- elif threadId == 99999:
- self.feedback['info']['specialCode'] = 1
- else:
- self.feedback['main']['data'] += chunkSize
- self.feedback['sub']['data'][threadId][0] += chunkSize
- self.feedback['sub']['stat'][threadId] = 1
-
- def runDownloaderNormal(self):
- req = requests.head(self.url, headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36"})
- self.feedback['info']['size'] = int(req.headers['Content-Length'])
- self.thread_signal.emit(self.feedback)
- # 初始化下载文件, 创建一个与文件大小相同的空间
- fo = open(self.saveFile, 'wb')
- fo.truncate(self.feedback['info']['size'])
- fo.close()
- self.feedback['info']['started'] = 1
- splitPart = self.feedback['info']['size'] // self.threadNum
- for i in range(self.threadNum):
- self.feedback['sub']['data'][i][1] = splitPart
-
- for i in range(self.threadNum):
- start = splitPart * i
- end = self.feedback['info']['size'] if i == self.threadNum - 1 else start + splitPart - 1
- self.downloaderNormal(start, end, i)
- self.sendSignal()
-
- def downloaderSpecial(self, chunkSize=10240):
- self.feedback['info']['downloader'] = 0
- self.feedback['info']['started'] = 1
- self.feedback['info']['size'] = 99999
- self.threads[f'thread99'] = DownloaderNornal(0, self.url, self.saveFile, 0, 0, 99)
- self.threads[f'thread99'].thread_signal.connect(self.resizeThread)
- self.threads[f'thread99'].start()
- self.sendSignal()
-
- def sendSignal(self):
- while self.runFlag == 0:
- savedData = self.feedback['main']['data']
- time.sleep(.5)
- speed = (self.feedback['main']['data'] - savedData) * 2
- self.feedback['main']['speed'] = speed
- self.thread_signal.emit(self.feedback)
- if self.feedback['main']['data'] >= self.feedback['info']['size'] and self.feedback['info']['downloader'] == 1:
- self.feedback['main']['data'] = self.feedback['info']['size']
- endTime = time.time()
- speed = self.feedback['info']['size'] / (endTime - self.startTime)
- self.feedback['info']['averageSpeed'] = speed
- self.thread_signal.emit(self.feedback)
- break
- elif self.feedback['info']['downloader'] == 0 and self.feedback['info']['specialCode'] == 1:
- self.feedback['info']['size'] = self.feedback['main']['data']
- endTime = time.time()
- speed = self.feedback['info']['size'] / (endTime - self.startTime)
- self.feedback['info']['averageSpeed'] = speed
- self.thread_signal.emit(self.feedback)
- break
diff --git a/function.py b/function.py
index 7cfb3bf..ff64910 100644
--- a/function.py
+++ b/function.py
@@ -1,7 +1,6 @@
import hashlib
import os
import subprocess
-
from PyQt5 import QtWidgets, QtCore, QtGui
from PyQt5.QtCore import Qt, QSize
from PyQt5.QtGui import QCursor
@@ -12,7 +11,6 @@
from Sub_Thread import Source_Thread
from Sub_Thread import Article_Thread
from Sub_Thread import Update_Thread
-from Sub_Thread import Download_Thread
from download_function import Download_UI
import soft_cfg
@@ -113,23 +111,6 @@ def __init__(self):
self.article_url = [] # 文章教程链接初始化
self.label_10.hide()
self.label_sys_info.hide()
- self.pros = [self.progressBar_downloader_sub0, self.progressBar_downloader_sub1,
- self.progressBar_downloader_sub2, self.progressBar_downloader_sub3,
- self.progressBar_downloader_sub4, self.progressBar_downloader_sub5,
- self.progressBar_downloader_sub6, self.progressBar_downloader_sub7,
- self.progressBar_downloader_sub8, self.progressBar_downloader_sub9,
- self.progressBar_downloader_sub10, self.progressBar_downloader_sub11,
- self.progressBar_downloader_sub12, self.progressBar_downloader_sub13,
- self.progressBar_downloader_sub14, self.progressBar_downloader_sub15]
- for i in self.pros:
- i.hide()
- self.progressBar_downloader_main.hide()
- self.textEdit_download_sub.hide()
- msm = f"欢迎试用此下载器
" \
- f"本软件为开源项目,可点击左侧'源码仓库'菜单,点击'System-assistant'查看程序源码
" \
- f"当前版本仅支持http/https下载协议的下载链接,其他协议链接正在添加中
" \
- f"程序功能正在逐步完善中,敬请期待...
"
- self.textEdit_download_top.append(msm)
# 线程启动
self.time_thread()
@@ -146,7 +127,6 @@ def signal_on_btn(self):
self.pushButton_help_us.clicked.connect(lambda: open_browser(soft_cfg.help_us))
self.pushButton_web_rights.clicked.connect(self.licenses)
self.pushButton_update.clicked.connect(self.update_thread)
- self.pushButton_downloader_new.clicked.connect(self.open_download_win)
# List Widget点击事件
self.listWidget_source.itemClicked.connect(self.source_item_clicked)
@@ -174,7 +154,7 @@ def icon_on_btn(self):
self.pushButton_menu_soft.setIcon(qtawesome.icon('fa.th-large', color='white'))
self.pushButton_menu_downloader.setIcon(qtawesome.icon('fa.download', color='white'))
# 下载器
- self.pushButton_downloader_new.setIcon(qtawesome.icon('fa.plus', color='blue'))
+ # self.pushButton_downloader_new.setIcon(qtawesome.icon('fa.plus', color='blue'))
# 自定义功能区
def window_close(self, code):
@@ -280,137 +260,6 @@ def Article_UI(self, msm):
def article_item_clicked(self, item):
open_browser(self.article_url[self.listWidget_article.currentIndex().row()])
- def open_download_win(self):
- downloadWin = Download_UI()
- downloadWin.mySignal.connect(self.download_thread)
- downloadWin.exec_()
-
- def download_thread(self, msm):
- url = msm[0]
- thread = msm[1]
- fileName = msm[2]
- self.progressBar_downloader_main.show()
- self.textEdit_download_top.clear()
- self.textEdit_download_sub.clear()
- self.textEdit_download_sub.show()
- try:
- self.download_Thread.stop()
- self.download_Thread.thread_signal.disconnect()
- except:
- pass
- self.download_Thread = Download_Thread(url, thread, fileName)
- self.download_Thread.thread_signal.connect(self.downloadThread)
- self.download_Thread.start()
- self.progressBar_downloader_main.setValue(0)
- for i in self.pros:
- i.setValue(0)
- for i in range(thread):
- self.pros[i].show()
-
- def downloadThread(self, msm):
- self.textEdit_download_top.clear()
- self.textEdit_download_sub.clear()
- isExists = msm.get('fileExists', 0)
- if isExists == 1:
- QMessageBox.information(self, '文件已经存在', f'检测到您要下载的文件已经存在,如果想要重新下载请删除 {msm["filePath"]} 后再进行下载')
- self.textEdit_download_top.append(f'检测到您要下载的文件已经存在
如果想要重新下载请删除 {msm["filePath"]} 后再进行下载
')
- self.textEdit_download_sub.hide()
- self.progressBar_downloader_main.hide()
- for i in self.pros:
- i.hide()
- else:
- isStarted = msm['info']['started']
- isMutiThread = msm['info']['downloader']
- isFinished = msm['info']['averageSpeed']
- if isStarted == 0:
- self.textEdit_download_top.append(f"下载程序正在初始化,这个过程不会很长\n请稍等...")
- else:
- if isMutiThread == 1 and isFinished == 0:
- ospeed = msm['main']['speed'] / 1024
- if ospeed == 0:
- ospeed = 1
- if ospeed > 1024:
- speed = f"{round(ospeed / 1024, 2)} M/s"
- else:
- speed = f"{ospeed} KB/s"
- underTime = (msm['info']['size'] - msm['main']['data']) / 1024 / ospeed
- if underTime > 60:
- underTime = f"{int(underTime / 60)} 分钟 {int(underTime % 60)} 秒"
- else:
- underTime = f"{int(underTime)} 秒"
- self.textEdit_download_top.append(
- f"文件来源:{msm['info']['url']}\n文件大小:{round(msm['info']['size'] / 1024 / 1024, 2)} MB\n已经下载:{round(msm['main']['data'] / 1024 / 1024, 2)} MB\n传输速度:{speed}\n剩余时间:{underTime}\n储存至:{msm['info']['saveTo']}\n")
- # 子进度条设置进度
- for i in range(msm['info']['thread']):
- self.pros[i].setValue(int(msm['sub']['data'][i][0] / msm['sub']['data'][i][1] * 100))
- # 主进度条设置进度
- self.progressBar_downloader_main.setValue(int(msm['main']['data'] / msm['info']['size'] * 100))
- # 子线程数据显示
- self.textEdit_download_sub.clear()
- for i in range(msm['info']['thread']):
- savedSubData = msm['sub']['data'][i][0] / 1024
- if savedSubData > 1024:
- savedSubData = f"{round(savedSubData / 1024, 2)} MB"
- else:
- savedSubData = f"{savedSubData} KB"
- if int(msm['sub']['data'][i][0] / 1024) >= int(msm['sub']['data'][i][1] / 1024):
- self.textEdit_download_sub.append(f"线程{i + 1}:已接收 {savedSubData},接收完成.")
- else:
- self.textEdit_download_sub.append(f"线程{i + 1}:已接收 {savedSubData},正在接收...")
- scrollbar = self.textEdit_download_sub.verticalScrollBar()
- scrollbar.setSliderPosition(0)
- elif isMutiThread == 1 and isFinished != 0:
- # 下载完成,隐藏子进度条
- for i in range(msm['info']['thread']):
- self.pros[i].hide()
- # 子线程数据显示
- self.textEdit_download_sub.clear()
- for i in range(msm['info']['thread']):
- savedSubData = msm['sub']['data'][i][0] / 1024
- if savedSubData > 1024:
- savedSubData = f"{round(savedSubData / 1024, 2)} MB"
- else:
- savedSubData = f"{savedSubData} KB"
- self.textEdit_download_sub.append(f"线程{i + 1}:已接收 {savedSubData},接收完成.")
- self.textEdit_download_sub.append(f"文件下载完成,已经保存到了 {msm['info']['saveTo']} ")
- scrollbar = self.textEdit_download_sub.verticalScrollBar()
- scrollbar.setSliderPosition(0)
- speed = isFinished / 1024
- if speed > 1024:
- speed = f"{round(speed / 1024, 2)} M/s"
- else:
- speed = f"{speed} KB/s"
- self.textEdit_download_top.append(
- f"文件来源:{msm['info']['url']}\n文件大小:{round(msm['info']['size'] / 1024 / 1024, 2)} MB\n已经下载:{round(msm['main']['data'] / 1024 / 1024, 2)} MB\n平均速度:{speed}\n已经储存至:{msm['info']['saveTo']}\n")
- self.progressBar_downloader_main.setValue(100)
- elif isMutiThread == 0 and isFinished == 0:
- ospeed = msm['main']['speed'] / 1024
- if ospeed == 0:
- ospeed = 1
- if ospeed > 1024:
- speed = f"{round(ospeed / 1024, 2)} M/s"
- else:
- speed = f"{ospeed} KB/s"
- self.textEdit_download_top.append(
- f"文件来源:{msm['info']['url']}\n文件大小:未知\n已经下载:{round(msm['main']['data'] / 1024 / 1024, 2)} MB\n传输速度:{speed}\n剩余时间:未知\n储存至:{msm['info']['saveTo']}\n")
- # 子进度条设置进度
- for i in range(msm['info']['thread']):
- self.pros[i].hide()
- # 主进度条设置进度
- self.progressBar_downloader_main.setValue(100)
- else:
- # 下载完成,隐藏子进度条
- for i in range(msm['info']['thread']):
- self.pros[i].hide()
- speed = isFinished / 1024
- if speed > 1024:
- speed = f"{round(speed / 1024, 2)} M/s"
- else:
- speed = f"{speed} KB/s"
- self.textEdit_download_top.append(
- f"文件来源:{msm['info']['url']}\n文件大小:{round(msm['main']['data'] / 1024 / 1024, 2)} MB\n已经下载:{round(msm['main']['data'] / 1024 / 1024, 2)} MB\n平均速度:{speed}\n已经储存至:{msm['info']['saveTo']}\n")
-
-
def update_thread(self, auto=True):
try:
self.update_Thread = Update_Thread(auto)
diff --git a/main_window.py b/main_window.py
index c36ddf3..fb91580 100644
--- a/main_window.py
+++ b/main_window.py
@@ -459,7 +459,7 @@ def setupUi(self, MainWindow):
self.widget_14 = QtWidgets.QWidget(self.downloader)
self.widget_14.setObjectName("widget_14")
self.verticalLayout_15 = QtWidgets.QVBoxLayout(self.widget_14)
- self.verticalLayout_15.setContentsMargins(10, 10, 10, 10)
+ self.verticalLayout_15.setContentsMargins(0, 0, 0, 0)
self.verticalLayout_15.setSpacing(0)
self.verticalLayout_15.setObjectName("verticalLayout_15")
self.widget_15 = QtWidgets.QWidget(self.widget_14)
@@ -485,246 +485,7 @@ def setupUi(self, MainWindow):
self.horizontalLayout_14.addItem(spacerItem8)
self.verticalLayout_15.addWidget(self.widget_15)
self.widget_16 = QtWidgets.QWidget(self.widget_14)
- self.widget_16.setStyleSheet("QWidget#widget_16{background:Transparent;border:1px solid grey}")
self.widget_16.setObjectName("widget_16")
- self.verticalLayout_16 = QtWidgets.QVBoxLayout(self.widget_16)
- self.verticalLayout_16.setContentsMargins(0, -1, 0, -1)
- self.verticalLayout_16.setSpacing(2)
- self.verticalLayout_16.setObjectName("verticalLayout_16")
- self.textEdit_download_top = QtWidgets.QTextEdit(self.widget_16)
- self.textEdit_download_top.setMinimumSize(QtCore.QSize(0, 150))
- self.textEdit_download_top.setMaximumSize(QtCore.QSize(16777215, 200))
- font = QtGui.QFont()
- font.setFamily("微软雅黑")
- self.textEdit_download_top.setFont(font)
- self.textEdit_download_top.setStyleSheet("QTextEdit{background:Transparent;border:0px solid grey}")
- self.textEdit_download_top.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
- self.textEdit_download_top.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
- self.textEdit_download_top.setReadOnly(True)
- self.textEdit_download_top.setObjectName("textEdit_download_top")
- self.verticalLayout_16.addWidget(self.textEdit_download_top)
- self.progressBar_downloader_main = QtWidgets.QProgressBar(self.widget_16)
- self.progressBar_downloader_main.setMinimumSize(QtCore.QSize(0, 30))
- self.progressBar_downloader_main.setMaximumSize(QtCore.QSize(16777215, 30))
- font = QtGui.QFont()
- font.setFamily("微软雅黑")
- self.progressBar_downloader_main.setFont(font)
- self.progressBar_downloader_main.setStyleSheet("QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}")
- self.progressBar_downloader_main.setProperty("value", 0)
- self.progressBar_downloader_main.setAlignment(QtCore.Qt.AlignCenter)
- self.progressBar_downloader_main.setTextVisible(True)
- self.progressBar_downloader_main.setObjectName("progressBar_downloader_main")
- self.verticalLayout_16.addWidget(self.progressBar_downloader_main)
- self.widget_17 = QtWidgets.QWidget(self.widget_16)
- self.widget_17.setMaximumSize(QtCore.QSize(980, 16777215))
- self.widget_17.setObjectName("widget_17")
- self.horizontalLayout = QtWidgets.QHBoxLayout(self.widget_17)
- self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
- self.horizontalLayout.setSpacing(0)
- self.horizontalLayout.setObjectName("horizontalLayout")
- self.progressBar_downloader_sub0 = QtWidgets.QProgressBar(self.widget_17)
- self.progressBar_downloader_sub0.setMinimumSize(QtCore.QSize(0, 20))
- self.progressBar_downloader_sub0.setMaximumSize(QtCore.QSize(16777215, 20))
- font = QtGui.QFont()
- font.setFamily("微软雅黑")
- self.progressBar_downloader_sub0.setFont(font)
- self.progressBar_downloader_sub0.setStyleSheet("QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}")
- self.progressBar_downloader_sub0.setProperty("value", 0)
- self.progressBar_downloader_sub0.setAlignment(QtCore.Qt.AlignCenter)
- self.progressBar_downloader_sub0.setTextVisible(False)
- self.progressBar_downloader_sub0.setObjectName("progressBar_downloader_sub0")
- self.horizontalLayout.addWidget(self.progressBar_downloader_sub0)
- self.progressBar_downloader_sub1 = QtWidgets.QProgressBar(self.widget_17)
- self.progressBar_downloader_sub1.setMinimumSize(QtCore.QSize(0, 20))
- self.progressBar_downloader_sub1.setMaximumSize(QtCore.QSize(16777215, 20))
- font = QtGui.QFont()
- font.setFamily("微软雅黑")
- self.progressBar_downloader_sub1.setFont(font)
- self.progressBar_downloader_sub1.setStyleSheet("QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}")
- self.progressBar_downloader_sub1.setProperty("value", 0)
- self.progressBar_downloader_sub1.setAlignment(QtCore.Qt.AlignCenter)
- self.progressBar_downloader_sub1.setTextVisible(False)
- self.progressBar_downloader_sub1.setObjectName("progressBar_downloader_sub1")
- self.horizontalLayout.addWidget(self.progressBar_downloader_sub1)
- self.progressBar_downloader_sub2 = QtWidgets.QProgressBar(self.widget_17)
- self.progressBar_downloader_sub2.setMinimumSize(QtCore.QSize(0, 20))
- self.progressBar_downloader_sub2.setMaximumSize(QtCore.QSize(16777215, 20))
- font = QtGui.QFont()
- font.setFamily("微软雅黑")
- self.progressBar_downloader_sub2.setFont(font)
- self.progressBar_downloader_sub2.setStyleSheet("QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}")
- self.progressBar_downloader_sub2.setProperty("value", 0)
- self.progressBar_downloader_sub2.setAlignment(QtCore.Qt.AlignCenter)
- self.progressBar_downloader_sub2.setTextVisible(False)
- self.progressBar_downloader_sub2.setObjectName("progressBar_downloader_sub2")
- self.horizontalLayout.addWidget(self.progressBar_downloader_sub2)
- self.progressBar_downloader_sub3 = QtWidgets.QProgressBar(self.widget_17)
- self.progressBar_downloader_sub3.setMinimumSize(QtCore.QSize(0, 20))
- self.progressBar_downloader_sub3.setMaximumSize(QtCore.QSize(16777215, 20))
- font = QtGui.QFont()
- font.setFamily("微软雅黑")
- self.progressBar_downloader_sub3.setFont(font)
- self.progressBar_downloader_sub3.setStyleSheet("QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}")
- self.progressBar_downloader_sub3.setProperty("value", 0)
- self.progressBar_downloader_sub3.setAlignment(QtCore.Qt.AlignCenter)
- self.progressBar_downloader_sub3.setTextVisible(False)
- self.progressBar_downloader_sub3.setObjectName("progressBar_downloader_sub3")
- self.horizontalLayout.addWidget(self.progressBar_downloader_sub3)
- self.progressBar_downloader_sub4 = QtWidgets.QProgressBar(self.widget_17)
- self.progressBar_downloader_sub4.setMinimumSize(QtCore.QSize(0, 20))
- self.progressBar_downloader_sub4.setMaximumSize(QtCore.QSize(16777215, 20))
- font = QtGui.QFont()
- font.setFamily("微软雅黑")
- self.progressBar_downloader_sub4.setFont(font)
- self.progressBar_downloader_sub4.setStyleSheet("QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}")
- self.progressBar_downloader_sub4.setProperty("value", 0)
- self.progressBar_downloader_sub4.setAlignment(QtCore.Qt.AlignCenter)
- self.progressBar_downloader_sub4.setTextVisible(False)
- self.progressBar_downloader_sub4.setObjectName("progressBar_downloader_sub4")
- self.horizontalLayout.addWidget(self.progressBar_downloader_sub4)
- self.progressBar_downloader_sub5 = QtWidgets.QProgressBar(self.widget_17)
- self.progressBar_downloader_sub5.setMinimumSize(QtCore.QSize(0, 20))
- self.progressBar_downloader_sub5.setMaximumSize(QtCore.QSize(16777215, 20))
- font = QtGui.QFont()
- font.setFamily("微软雅黑")
- self.progressBar_downloader_sub5.setFont(font)
- self.progressBar_downloader_sub5.setStyleSheet("QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}")
- self.progressBar_downloader_sub5.setProperty("value", 0)
- self.progressBar_downloader_sub5.setAlignment(QtCore.Qt.AlignCenter)
- self.progressBar_downloader_sub5.setTextVisible(False)
- self.progressBar_downloader_sub5.setObjectName("progressBar_downloader_sub5")
- self.horizontalLayout.addWidget(self.progressBar_downloader_sub5)
- self.progressBar_downloader_sub6 = QtWidgets.QProgressBar(self.widget_17)
- self.progressBar_downloader_sub6.setMinimumSize(QtCore.QSize(0, 20))
- self.progressBar_downloader_sub6.setMaximumSize(QtCore.QSize(16777215, 20))
- font = QtGui.QFont()
- font.setFamily("微软雅黑")
- self.progressBar_downloader_sub6.setFont(font)
- self.progressBar_downloader_sub6.setStyleSheet("QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}")
- self.progressBar_downloader_sub6.setProperty("value", 0)
- self.progressBar_downloader_sub6.setAlignment(QtCore.Qt.AlignCenter)
- self.progressBar_downloader_sub6.setTextVisible(False)
- self.progressBar_downloader_sub6.setObjectName("progressBar_downloader_sub6")
- self.horizontalLayout.addWidget(self.progressBar_downloader_sub6)
- self.progressBar_downloader_sub7 = QtWidgets.QProgressBar(self.widget_17)
- self.progressBar_downloader_sub7.setMinimumSize(QtCore.QSize(0, 20))
- self.progressBar_downloader_sub7.setMaximumSize(QtCore.QSize(16777215, 20))
- font = QtGui.QFont()
- font.setFamily("微软雅黑")
- self.progressBar_downloader_sub7.setFont(font)
- self.progressBar_downloader_sub7.setStyleSheet("QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}")
- self.progressBar_downloader_sub7.setProperty("value", 0)
- self.progressBar_downloader_sub7.setAlignment(QtCore.Qt.AlignCenter)
- self.progressBar_downloader_sub7.setTextVisible(False)
- self.progressBar_downloader_sub7.setObjectName("progressBar_downloader_sub7")
- self.horizontalLayout.addWidget(self.progressBar_downloader_sub7)
- self.progressBar_downloader_sub8 = QtWidgets.QProgressBar(self.widget_17)
- self.progressBar_downloader_sub8.setMinimumSize(QtCore.QSize(0, 20))
- self.progressBar_downloader_sub8.setMaximumSize(QtCore.QSize(16777215, 20))
- font = QtGui.QFont()
- font.setFamily("微软雅黑")
- self.progressBar_downloader_sub8.setFont(font)
- self.progressBar_downloader_sub8.setStyleSheet("QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}")
- self.progressBar_downloader_sub8.setProperty("value", 0)
- self.progressBar_downloader_sub8.setAlignment(QtCore.Qt.AlignCenter)
- self.progressBar_downloader_sub8.setTextVisible(False)
- self.progressBar_downloader_sub8.setObjectName("progressBar_downloader_sub8")
- self.horizontalLayout.addWidget(self.progressBar_downloader_sub8)
- self.progressBar_downloader_sub9 = QtWidgets.QProgressBar(self.widget_17)
- self.progressBar_downloader_sub9.setMinimumSize(QtCore.QSize(0, 20))
- self.progressBar_downloader_sub9.setMaximumSize(QtCore.QSize(16777215, 20))
- font = QtGui.QFont()
- font.setFamily("微软雅黑")
- self.progressBar_downloader_sub9.setFont(font)
- self.progressBar_downloader_sub9.setStyleSheet("QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}")
- self.progressBar_downloader_sub9.setProperty("value", 0)
- self.progressBar_downloader_sub9.setAlignment(QtCore.Qt.AlignCenter)
- self.progressBar_downloader_sub9.setTextVisible(False)
- self.progressBar_downloader_sub9.setObjectName("progressBar_downloader_sub9")
- self.horizontalLayout.addWidget(self.progressBar_downloader_sub9)
- self.progressBar_downloader_sub10 = QtWidgets.QProgressBar(self.widget_17)
- self.progressBar_downloader_sub10.setMinimumSize(QtCore.QSize(0, 20))
- self.progressBar_downloader_sub10.setMaximumSize(QtCore.QSize(16777215, 20))
- font = QtGui.QFont()
- font.setFamily("微软雅黑")
- self.progressBar_downloader_sub10.setFont(font)
- self.progressBar_downloader_sub10.setStyleSheet("QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}")
- self.progressBar_downloader_sub10.setProperty("value", 0)
- self.progressBar_downloader_sub10.setAlignment(QtCore.Qt.AlignCenter)
- self.progressBar_downloader_sub10.setTextVisible(False)
- self.progressBar_downloader_sub10.setObjectName("progressBar_downloader_sub10")
- self.horizontalLayout.addWidget(self.progressBar_downloader_sub10)
- self.progressBar_downloader_sub11 = QtWidgets.QProgressBar(self.widget_17)
- self.progressBar_downloader_sub11.setMinimumSize(QtCore.QSize(0, 20))
- self.progressBar_downloader_sub11.setMaximumSize(QtCore.QSize(16777215, 20))
- font = QtGui.QFont()
- font.setFamily("微软雅黑")
- self.progressBar_downloader_sub11.setFont(font)
- self.progressBar_downloader_sub11.setStyleSheet("QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}")
- self.progressBar_downloader_sub11.setProperty("value", 0)
- self.progressBar_downloader_sub11.setAlignment(QtCore.Qt.AlignCenter)
- self.progressBar_downloader_sub11.setTextVisible(False)
- self.progressBar_downloader_sub11.setObjectName("progressBar_downloader_sub11")
- self.horizontalLayout.addWidget(self.progressBar_downloader_sub11)
- self.progressBar_downloader_sub12 = QtWidgets.QProgressBar(self.widget_17)
- self.progressBar_downloader_sub12.setMinimumSize(QtCore.QSize(0, 20))
- self.progressBar_downloader_sub12.setMaximumSize(QtCore.QSize(16777215, 20))
- font = QtGui.QFont()
- font.setFamily("微软雅黑")
- self.progressBar_downloader_sub12.setFont(font)
- self.progressBar_downloader_sub12.setStyleSheet("QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}")
- self.progressBar_downloader_sub12.setProperty("value", 0)
- self.progressBar_downloader_sub12.setAlignment(QtCore.Qt.AlignCenter)
- self.progressBar_downloader_sub12.setTextVisible(False)
- self.progressBar_downloader_sub12.setObjectName("progressBar_downloader_sub12")
- self.horizontalLayout.addWidget(self.progressBar_downloader_sub12)
- self.progressBar_downloader_sub13 = QtWidgets.QProgressBar(self.widget_17)
- self.progressBar_downloader_sub13.setMinimumSize(QtCore.QSize(0, 20))
- self.progressBar_downloader_sub13.setMaximumSize(QtCore.QSize(16777215, 20))
- font = QtGui.QFont()
- font.setFamily("微软雅黑")
- self.progressBar_downloader_sub13.setFont(font)
- self.progressBar_downloader_sub13.setStyleSheet("QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}")
- self.progressBar_downloader_sub13.setProperty("value", 0)
- self.progressBar_downloader_sub13.setAlignment(QtCore.Qt.AlignCenter)
- self.progressBar_downloader_sub13.setTextVisible(False)
- self.progressBar_downloader_sub13.setObjectName("progressBar_downloader_sub13")
- self.horizontalLayout.addWidget(self.progressBar_downloader_sub13)
- self.progressBar_downloader_sub14 = QtWidgets.QProgressBar(self.widget_17)
- self.progressBar_downloader_sub14.setMinimumSize(QtCore.QSize(0, 20))
- self.progressBar_downloader_sub14.setMaximumSize(QtCore.QSize(16777215, 20))
- font = QtGui.QFont()
- font.setFamily("微软雅黑")
- self.progressBar_downloader_sub14.setFont(font)
- self.progressBar_downloader_sub14.setStyleSheet("QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}")
- self.progressBar_downloader_sub14.setProperty("value", 0)
- self.progressBar_downloader_sub14.setAlignment(QtCore.Qt.AlignCenter)
- self.progressBar_downloader_sub14.setTextVisible(False)
- self.progressBar_downloader_sub14.setObjectName("progressBar_downloader_sub14")
- self.horizontalLayout.addWidget(self.progressBar_downloader_sub14)
- self.progressBar_downloader_sub15 = QtWidgets.QProgressBar(self.widget_17)
- self.progressBar_downloader_sub15.setMinimumSize(QtCore.QSize(0, 20))
- self.progressBar_downloader_sub15.setMaximumSize(QtCore.QSize(16777215, 20))
- font = QtGui.QFont()
- font.setFamily("微软雅黑")
- self.progressBar_downloader_sub15.setFont(font)
- self.progressBar_downloader_sub15.setStyleSheet("QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}")
- self.progressBar_downloader_sub15.setProperty("value", 0)
- self.progressBar_downloader_sub15.setAlignment(QtCore.Qt.AlignCenter)
- self.progressBar_downloader_sub15.setTextVisible(False)
- self.progressBar_downloader_sub15.setObjectName("progressBar_downloader_sub15")
- self.horizontalLayout.addWidget(self.progressBar_downloader_sub15)
- self.verticalLayout_16.addWidget(self.widget_17)
- self.textEdit_download_sub = QtWidgets.QTextEdit(self.widget_16)
- font = QtGui.QFont()
- font.setFamily("微软雅黑")
- self.textEdit_download_sub.setFont(font)
- self.textEdit_download_sub.setStyleSheet("QTextEdit{background:Transparent;border:0px solid grey}")
- self.textEdit_download_sub.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
- self.textEdit_download_sub.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
- self.textEdit_download_sub.setReadOnly(True)
- self.textEdit_download_sub.setObjectName("textEdit_download_sub")
- self.verticalLayout_16.addWidget(self.textEdit_download_sub)
self.verticalLayout_15.addWidget(self.widget_16)
self.horizontalLayout_13.addWidget(self.widget_14)
self.stackedWidget.addWidget(self.downloader)
@@ -735,7 +496,7 @@ def setupUi(self, MainWindow):
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
- self.stackedWidget.setCurrentIndex(5)
+ self.stackedWidget.setCurrentIndex(7)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
@@ -767,21 +528,4 @@ def retranslateUi(self, MainWindow):
self.label_time.setText(_translate("MainWindow", "TextLabel"))
self.pushButton_downloader_new.setToolTip(_translate("MainWindow", "新建下载
"))
self.pushButton_downloader_new.setText(_translate("MainWindow", "新建下载"))
- self.progressBar_downloader_main.setFormat(_translate("MainWindow", "%p%"))
- self.progressBar_downloader_sub0.setFormat(_translate("MainWindow", "线程1"))
- self.progressBar_downloader_sub1.setFormat(_translate("MainWindow", "线程2"))
- self.progressBar_downloader_sub2.setFormat(_translate("MainWindow", "线程3"))
- self.progressBar_downloader_sub3.setFormat(_translate("MainWindow", "线程4"))
- self.progressBar_downloader_sub4.setFormat(_translate("MainWindow", "线程5"))
- self.progressBar_downloader_sub5.setFormat(_translate("MainWindow", "线程6"))
- self.progressBar_downloader_sub6.setFormat(_translate("MainWindow", "线程7"))
- self.progressBar_downloader_sub7.setFormat(_translate("MainWindow", "线程8"))
- self.progressBar_downloader_sub8.setFormat(_translate("MainWindow", "线程9"))
- self.progressBar_downloader_sub9.setFormat(_translate("MainWindow", "线程10"))
- self.progressBar_downloader_sub10.setFormat(_translate("MainWindow", "线程11"))
- self.progressBar_downloader_sub11.setFormat(_translate("MainWindow", "线程12"))
- self.progressBar_downloader_sub12.setFormat(_translate("MainWindow", "线程13"))
- self.progressBar_downloader_sub13.setFormat(_translate("MainWindow", "线程14"))
- self.progressBar_downloader_sub14.setFormat(_translate("MainWindow", "线程15"))
- self.progressBar_downloader_sub15.setFormat(_translate("MainWindow", "%p%"))
import resources_rc
diff --git a/main_window.ui b/main_window.ui
index 575c3cd..14545de 100644
--- a/main_window.ui
+++ b/main_window.ui
@@ -531,7 +531,7 @@
- 5
+ 7
@@ -1147,16 +1147,16 @@
0
- 10
+ 0
- 10
+ 0
- 10
+ 0
- 10
+ 0
-
@@ -1237,715 +1237,7 @@
-
-
-
- QWidget#widget_16{background:Transparent;border:1px solid grey}
-
-
-
- 2
-
-
- 0
-
-
- 0
-
-
-
-
-
-
- 0
- 150
-
-
-
-
- 16777215
- 200
-
-
-
-
- 微软雅黑
-
-
-
- QTextEdit{background:Transparent;border:0px solid grey}
-
-
- Qt::ScrollBarAlwaysOff
-
-
- Qt::ScrollBarAlwaysOff
-
-
- true
-
-
-
- -
-
-
-
- 0
- 30
-
-
-
-
- 16777215
- 30
-
-
-
-
- 微软雅黑
-
-
-
- QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}
-
-
- 0
-
-
- Qt::AlignCenter
-
-
- true
-
-
- %p%
-
-
-
- -
-
-
-
- 980
- 16777215
-
-
-
-
- 0
-
-
- 0
-
-
- 0
-
-
- 0
-
-
- 0
-
-
-
-
-
-
- 0
- 20
-
-
-
-
- 16777215
- 20
-
-
-
-
- 微软雅黑
-
-
-
- QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}
-
-
- 0
-
-
- Qt::AlignCenter
-
-
- false
-
-
- 线程1
-
-
-
- -
-
-
-
- 0
- 20
-
-
-
-
- 16777215
- 20
-
-
-
-
- 微软雅黑
-
-
-
- QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}
-
-
- 0
-
-
- Qt::AlignCenter
-
-
- false
-
-
- 线程2
-
-
-
- -
-
-
-
- 0
- 20
-
-
-
-
- 16777215
- 20
-
-
-
-
- 微软雅黑
-
-
-
- QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}
-
-
- 0
-
-
- Qt::AlignCenter
-
-
- false
-
-
- 线程3
-
-
-
- -
-
-
-
- 0
- 20
-
-
-
-
- 16777215
- 20
-
-
-
-
- 微软雅黑
-
-
-
- QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}
-
-
- 0
-
-
- Qt::AlignCenter
-
-
- false
-
-
- 线程4
-
-
-
- -
-
-
-
- 0
- 20
-
-
-
-
- 16777215
- 20
-
-
-
-
- 微软雅黑
-
-
-
- QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}
-
-
- 0
-
-
- Qt::AlignCenter
-
-
- false
-
-
- 线程5
-
-
-
- -
-
-
-
- 0
- 20
-
-
-
-
- 16777215
- 20
-
-
-
-
- 微软雅黑
-
-
-
- QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}
-
-
- 0
-
-
- Qt::AlignCenter
-
-
- false
-
-
- 线程6
-
-
-
- -
-
-
-
- 0
- 20
-
-
-
-
- 16777215
- 20
-
-
-
-
- 微软雅黑
-
-
-
- QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}
-
-
- 0
-
-
- Qt::AlignCenter
-
-
- false
-
-
- 线程7
-
-
-
- -
-
-
-
- 0
- 20
-
-
-
-
- 16777215
- 20
-
-
-
-
- 微软雅黑
-
-
-
- QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}
-
-
- 0
-
-
- Qt::AlignCenter
-
-
- false
-
-
- 线程8
-
-
-
- -
-
-
-
- 0
- 20
-
-
-
-
- 16777215
- 20
-
-
-
-
- 微软雅黑
-
-
-
- QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}
-
-
- 0
-
-
- Qt::AlignCenter
-
-
- false
-
-
- 线程9
-
-
-
- -
-
-
-
- 0
- 20
-
-
-
-
- 16777215
- 20
-
-
-
-
- 微软雅黑
-
-
-
- QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}
-
-
- 0
-
-
- Qt::AlignCenter
-
-
- false
-
-
- 线程10
-
-
-
- -
-
-
-
- 0
- 20
-
-
-
-
- 16777215
- 20
-
-
-
-
- 微软雅黑
-
-
-
- QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}
-
-
- 0
-
-
- Qt::AlignCenter
-
-
- false
-
-
- 线程11
-
-
-
- -
-
-
-
- 0
- 20
-
-
-
-
- 16777215
- 20
-
-
-
-
- 微软雅黑
-
-
-
- QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}
-
-
- 0
-
-
- Qt::AlignCenter
-
-
- false
-
-
- 线程12
-
-
-
- -
-
-
-
- 0
- 20
-
-
-
-
- 16777215
- 20
-
-
-
-
- 微软雅黑
-
-
-
- QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}
-
-
- 0
-
-
- Qt::AlignCenter
-
-
- false
-
-
- 线程13
-
-
-
- -
-
-
-
- 0
- 20
-
-
-
-
- 16777215
- 20
-
-
-
-
- 微软雅黑
-
-
-
- QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}
-
-
- 0
-
-
- Qt::AlignCenter
-
-
- false
-
-
- 线程14
-
-
-
- -
-
-
-
- 0
- 20
-
-
-
-
- 16777215
- 20
-
-
-
-
- 微软雅黑
-
-
-
- QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}
-
-
- 0
-
-
- Qt::AlignCenter
-
-
- false
-
-
- 线程15
-
-
-
- -
-
-
-
- 0
- 20
-
-
-
-
- 16777215
- 20
-
-
-
-
- 微软雅黑
-
-
-
- QProgressBar{background:Transparent;border:1px solid grey}QProgressBar::chunk{background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0#00b09b,stop:1 #96c93d);}
-
-
- 0
-
-
- Qt::AlignCenter
-
-
- false
-
-
- %p%
-
-
-
-
-
-
- -
-
-
-
- 微软雅黑
-
-
-
- QTextEdit{background:Transparent;border:0px solid grey}
-
-
- Qt::ScrollBarAlwaysOff
-
-
- Qt::ScrollBarAlwaysOff
-
-
- true
-
-
-
-
-
+
From b655db3197505a6a9d9027fbe486a1323c6d6e9f Mon Sep 17 00:00:00 2001
From: Rui Ma
Date: Sat, 9 May 2020 21:35:33 +0800
Subject: [PATCH 05/11] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BA=86aria2=E4=B8=8B?=
=?UTF-8?q?=E8=BD=BD=E6=94=AF=E6=8C=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
新增了aria2下载支持
---
.gitignore | 1 +
.idea/workspace.xml | 22 +++++------
Sub_Thread.py | 19 +++++++++
aria2.conf | 93 ++++++++++++++++++++++++++++++++++++++++++++
aria2.session | 0
aria2c.exe | Bin 0 -> 5117952 bytes
function.py | 34 +++++++++++++---
main_window.py | 32 ++-------------
main_window.ui | 82 +-------------------------------------
9 files changed, 158 insertions(+), 125 deletions(-)
create mode 100644 aria2.conf
create mode 100644 aria2.session
create mode 100644 aria2c.exe
diff --git a/.gitignore b/.gitignore
index 0420071..7bc1439 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,6 +12,7 @@ test*.py
# Distribution / packaging
.Python
.idea/
+Download/
build/
develop-eggs/
dist/
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 18c8f3e..4e6e11a 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -48,7 +48,7 @@
-
+
@@ -169,40 +169,40 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
diff --git a/Sub_Thread.py b/Sub_Thread.py
index 2d26295..79e33a6 100644
--- a/Sub_Thread.py
+++ b/Sub_Thread.py
@@ -2,6 +2,8 @@
import time
import requests
import json
+import os
+import subprocess
import soft_cfg
@@ -96,3 +98,20 @@ def run(self):
else:
result["auto"] = False
self.display_signal.emit(result)
+
+
+class Downloader_Thread(QThread):
+ display_signal = pyqtSignal(bool)
+
+ def __init__(self):
+ super().__init__()
+
+ def run(self):
+ if os.path.exists('Download'):
+ pass
+ else:
+ os.mkdir('Download')
+ subprocess.Popen("aria2c.exe --conf-path=aria2.conf")
+
+ def stop(self):
+ subprocess.Popen("taskkill /F /IM aria2c.exe")
diff --git a/aria2.conf b/aria2.conf
new file mode 100644
index 0000000..87e39fc
--- /dev/null
+++ b/aria2.conf
@@ -0,0 +1,93 @@
+## 文件保存相关 ##
+
+# 文件的保存路径(可使用绝对路径或相对路径), 默认: 当前启动位置
+dir=Download
+# 启用磁盘缓存, 0为禁用缓存, 需1.16以上版本, 默认:16M
+disk-cache=32M
+# 文件预分配方式, 能有效降低磁盘碎片, 默认:prealloc
+# 预分配所需时间: none < falloc ? trunc < prealloc
+# falloc和trunc则需要文件系统和内核支持
+# NTFS建议使用falloc, EXT3/4建议trunc, MAC 下需要注释此项
+file-allocation=falloc
+# 断点续传
+continue=true
+
+## 下载连接相关 ##
+
+# 最大同时下载任务数, 运行时可修改, 默认:5
+max-concurrent-downloads=16
+# 同一服务器连接数, 添加时可指定, 默认:1
+max-connection-per-server=16
+# 最小文件分片大小, 添加时可指定, 取值范围1M -1024M, 默认:20M
+# 假定size=10M, 文件为20MiB 则使用两个来源下载; 文件为15MiB 则使用一个来源下载
+min-split-size=10M
+# 单个任务最大线程数, 添加时可指定, 默认:5
+split=8
+# 整体下载速度限制, 运行时可修改, 默认:0
+#max-overall-download-limit=0
+# 单个任务下载速度限制, 默认:0
+#max-download-limit=0
+# 整体上传速度限制, 运行时可修改, 默认:0
+#max-overall-upload-limit=0
+# 单个任务上传速度限制, 默认:0
+#max-upload-limit=0
+# 禁用IPv6, 默认:false
+disable-ipv6=false
+
+## 进度保存相关 ##
+
+# 从会话文件中读取下载任务
+input-file=aria2.session
+# 在Aria2退出时保存`错误/未完成`的下载任务到会话文件
+save-session=aria2.session
+# 定时保存会话, 0为退出时才保存, 需1.16.1以上版本, 默认:0
+save-session-interval=10
+
+## RPC相关设置 ##
+
+# 启用RPC, 默认:false
+enable-rpc=true
+# 允许所有来源, 默认:false
+rpc-allow-origin-all=true
+# 允许非外部访问, 默认:false
+rpc-listen-all=true
+# 事件轮询方式, 取值:[epoll, kqueue, port, poll, select], 不同系统默认值不同
+#event-poll=select
+# RPC监听端口, 端口被占用时可以修改, 默认:6800
+#rpc-listen-port=6800
+
+## BT/PT下载相关 ##
+
+# 当下载的是一个种子(以.torrent结尾)时, 自动开始BT任务, 默认:true
+#follow-torrent=true
+# BT监听端口, 当端口被屏蔽时使用, 默认:6881-6999
+listen-port=51413
+# 单个种子最大连接数, 默认:55
+#bt-max-peers=55
+# 打开DHT功能, PT需要禁用, 默认:true
+enable-dht=true
+# 打开IPv6 DHT功能, PT需要禁用
+enable-dht6=true
+# DHT网络监听端口, 默认:6881-6999
+#dht-listen-port=6881-6999
+# 本地节点查找, PT需要禁用, 默认:false
+bt-enable-lpd=true
+# 种子交换, PT需要禁用, 默认:true
+enable-peer-exchange=true
+# 每个种子限速, 对少种的PT很有用, 默认:50K
+#bt-request-peer-speed-limit=50K
+# 客户端伪装, PT需要
+peer-id-prefix=-TR2770-
+user-agent=Transmission/2.77
+# 当种子的分享率达到这个数时, 自动停止做种, 0为一直做种, 默认:1.0
+seed-ratio=0
+# 强制保存会话, 话即使任务已经完成, 默认:false
+# 较新的版本开启后会在任务完成后依然保留.aria2文件
+#force-save=false
+# BT校验相关, 默认:true
+#bt-hash-check-seed=true
+# 继续之前的BT任务时, 无需再次校验, 默认:false
+bt-seed-unverified=true
+# 保存磁力链接元数据为种子文件(.torrent文件), 默认:false
+bt-save-metadata=true
+bt-tracker=udp://tracker.coppersurfer.tk:6969/announce,udp://tracker.leechers-paradise.org:6969/announce,udp://tracker.opentrackr.org:1337/announce,udp://p4p.arenabg.com:1337/announce,udp://9.rarbg.to:2710/announce,udp://9.rarbg.me:2710/announce,udp://tracker.openbittorrent.com:80/announce,udp://exodus.desync.com:6969/announce,udp://tracker.tiny-vps.com:6969/announce,udp://retracker.lanta-net.ru:2710/announce,udp://open.stealth.si:80/announce,udp://tracker.moeking.me:6969/announce,udp://denis.stalker.upeer.me:6969/announce,udp://tracker.torrent.eu.org:451/announce,udp://tracker.cyberia.is:6969/announce,udp://open.demonii.si:1337/announce,udp://ipv4.tracker.harry.lu:80/announce,udp://explodie.org:6969/announce,udp://xxxtor.com:2710/announce,udp://valakas.rollo.dnsabr.com:2710/announce
diff --git a/aria2.session b/aria2.session
new file mode 100644
index 0000000..e69de29
diff --git a/aria2c.exe b/aria2c.exe
new file mode 100644
index 0000000000000000000000000000000000000000..18b2b7bcb2a4ce4487c83aad8a06d388b49e304b
GIT binary patch
literal 5117952
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