├── .gitee ├── ISSUE_GUIDELINES.md └── ISSUE_TEMPLATE.zh-CN.md ├── .github └── ISSUE_TEMPLATE │ ├── ISSUE_GUIDELINES.md │ ├── bug_report.yaml │ └── feature_request.yaml ├── .gitignore ├── .idea ├── .gitignore ├── MOS.iml ├── dictionaries │ └── xyj.xml ├── git_toolbox_prj.xml ├── inspectionProfiles │ └── profiles_settings.xml ├── jsonSchemas.xml ├── misc.xml ├── modules.xml └── vcs.xml ├── .qt_for_python ├── rcc │ ├── Java_Dowmloader.py │ ├── MOS.py │ ├── MOS_start_loading.py │ └── img.py └── uic │ ├── 2.py │ ├── Java_Dowmloader.py │ ├── Java_Dowmloader_OK_UI.py │ ├── Java_Dowmloader_UI.py │ ├── MOS_UI.py │ ├── MOS_UI2.py │ ├── MOS_UI的副本.py │ └── MOS_start_loading.py ├── .vscode └── settings.json ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── Delete_Game_F.py ├── Delete_Game_F_UI.py ├── Download ├── 1.py ├── 2.py ├── 3.py ├── 4.py └── 5.py ├── Java_Downloader_.py ├── Java_Downloader_OK.py ├── Java_Downloader_OK_UI.py ├── Java_Downloader_OK_UI_rc.py ├── Java_Downloader_UI.py ├── LICENSE ├── MC_Dowmloader.py ├── MC_Dowmloader_OK.py ├── MC_Dowmloader_OK_UI.py ├── MC_Dowmloader_UI.py ├── MOS.icns ├── MOS.py ├── MOS_Downloader.py ├── MOS_UI.py ├── MOS_UI_Main.py ├── MOS_print_.py ├── MOS_rc.py ├── MOS_start_loading.py ├── MOS_start_loading_rc.py ├── MOS_versions.json ├── Mac非app启动.command ├── Mod.rtfd └── TXT.rtf ├── README.md ├── UI ├── UI │ ├── 6.py │ ├── Delete_Game_F_UI.py │ ├── Delete_Game_F_UI.ui │ ├── Java_Dowmloader.py │ ├── Java_Dowmloader_OK_UI.py │ ├── Java_Dowmloader_OK_UI.ui │ ├── Java_Dowmloader_UI.py │ ├── Java_Dowmloader_UI.ui │ ├── MC_Dowmloader_OK_UI.py │ ├── MC_Dowmloader_OK_UI.ui │ ├── MC_Dowmloader_UI.py │ ├── MC_Dowmloader_UI.ui │ ├── MOS_UI.py │ ├── MOS_UI.ui │ ├── MOS_start_loading.py │ └── MOS_start_loading.ui └── qrc │ ├── Java_Dowmloader.qrc │ ├── MOS.qrc │ ├── MOS_rc.py │ ├── MOS_start_loading.qrc │ ├── MOS_start_loading_rc.py │ ├── OK.png │ ├── back_blue_down.png │ ├── back_blue_up.png │ ├── caret-down.png │ ├── caret-down_1.png │ ├── caret-up.png │ ├── caret-up_1.png │ ├── close.png │ ├── hide.png │ ├── ico.png │ └── loading_3.gif ├── html ├── MOS.htmlm ├── MOS原.html └── versions.html ├── librarys └── forge-install-bootstrapper.jar-mos └── picture ├── MOS_loading_start.png ├── OK.png ├── SkyWorldStudio.png ├── about.png ├── add.png ├── back.png ├── back_blue.png ├── back_blue_down.png ├── back_blue_up.png ├── back_down.png ├── back_up.png ├── caret-down.png ├── caret-down_1.png ├── caret-up.png ├── caret-up_1.png ├── close.png ├── david.png ├── diamond-pickaxe.svg ├── download.png ├── fabric.png ├── false.png ├── folder.png ├── folder_add.png ├── folder_minus.png ├── folder_open.png ├── forge.png ├── grass.png ├── heimnad.png ├── hide.png ├── home.png ├── ico.icns ├── ico.png ├── loading.gif ├── loading_2.gif ├── loading_2_black.gif ├── loading_3.gif ├── loading_3_black.gif ├── loading_black.gif ├── minecraft.png ├── music.png ├── online.png ├── online_2.png ├── optifine.png ├── quilt.png ├── return.png ├── settings.png ├── trash.png ├── trash_red.png ├── user.png ├── user_add.png ├── user_delete.png ├── white.png └── yes.png /.gitee/ISSUE_GUIDELINES.md: -------------------------------------------------------------------------------- 1 | ## 在你开始之前... 2 | 3 | 1. 请确保您使用的是最新版本 4 | 2. 请务必认真填写问卷 5 | 3. 一个issue只可写bug或建议,不可将Bug和建议写在一起(除非,您在给我出 关于这个bug怎么修的 主意 6 | 4. 如果您反馈的是Bug,那么请删除有关“建议反馈板块”的内容。同理,如果您反馈的是建议,那么请删除有关“Bug反馈板块”的内容。 7 | 5. 在反馈前,请您用平台提供的搜索功能,查找是否有类似的反馈。重复提交并不利于开发者处理问题。 8 | 6. 如果您能上[GitHub](https://github.com/xianyongjian080402/Minecraft-Optimal-Starter_2/issues),也请去GitHub上搜索,看看是否有类似反馈 9 | 7. 请在反馈的标题前安装反馈类别(Bug/建议)添加[Bug]或[建议] 注:注意要带方括号 10 | 8. 强烈建议您去[GitHub](https://github.com/xianyongjian080402/Minecraft-Optimal-Starter_2/issues)上进行反馈 (去了就知道为什么) 11 | 12 | > 不符合要求的issue大概率会被强制关闭 13 | 14 | **感谢您对我们的支持与谅解** 15 | -------------------------------------------------------------------------------- /.gitee/ISSUE_TEMPLATE.zh-CN.md: -------------------------------------------------------------------------------- 1 | ### 开始前 2 | 3 | 4 | 5 | 6 | - [ ] 我已经认真阅读[说明文件(Githib)](https://github.com/xianyongjian080402/Minecraft-Optimal-Starter_2/blob/master/.github/ISSUE_TEMPLATE/ISSUE_GUIDELINES.md)/[说明文件(Gitee)](https://gitee.com/xian66/minecraft-optimal-starter_2/blob/master/.gitee/ISSUE_GUIDELINES.md) 7 | 8 | 9 | 10 | 11 | 12 | ### Bug描述 13 | 14 | ### 复现方法(重现步骤) 15 | 16 | ### 期望效果 17 | 18 | ### 实际效果 19 | 20 | ### 截图 21 | 22 | 23 | ### 日志 24 | 25 | 26 | ### 备注 27 | 28 | ### 附言 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | ### 需求/意见说明 39 | 40 | ### 详细说明 41 | 42 | ### 解决什么痛点/带来什么收益 43 | 44 | ### 实现方法 45 | 46 | 47 | 48 | ### 要用到的API/库 49 | 50 | 51 | 52 | ### 帮助文档 53 | 54 | 55 | ### 备注 56 | 57 | 58 | ### 留言 59 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/ISSUE_GUIDELINES.md: -------------------------------------------------------------------------------- 1 | ## 在你开始之前... 2 | 3 | 1. 请确保您使用的是最新版本 4 | 2. 请务必认真填写问卷 5 | 3. 一个issue只可写bug或建议,不可将Bug和建议写在一起(除非,您在给我出 关于这个bug怎么修的 主意 6 | 4. 如果您反馈的是Bug,那么请删除有关“建议反馈板块”的内容。同理,如果您反馈的是建议,那么请删除有关“Bug反馈板块”的内容。 7 | 5. 在反馈前,请您用平台提供的搜索功能,查找是否有类似的反馈。重复提交并不利于开发者处理问题。 8 | 6. 如果您能上[GitHub](https://github.com/xianyongjian080402/Minecraft-Optimal-Starter_2/issues),也请去GitHub上搜索,看看是否有类似反馈 9 | 7. 请在反馈的标题前安装反馈类别(Bug/建议)添加[Bug]或[建议] 注:注意要带方括号 10 | 8. 强烈建议您去[GitHub](https://github.com/xianyongjian080402/Minecraft-Optimal-Starter_2/issues)上进行反馈 (去了就知道为什么) 11 | 12 | > 不符合要求的issue大概率会被强制关闭 13 | 14 | **感谢您对我们的支持与谅解** 15 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.yaml: -------------------------------------------------------------------------------- 1 | name: 反馈一个新Bug 2 | description: 在这里,你可以反馈本项目的新Bug 3 | title: "[BUG]" 4 | labels: ["bug"] 5 | assignees: 6 | - OasisAkari 7 | body: 8 | - type: markdown 9 | attributes: 10 | value: | 11 | 无论您提交的Bug有多么简单, 也请严格按照 Issue 模板填写信息, 未正确套用模板或信息不全的将不做处理. 感谢配合 12 | - type: checkboxes 13 | id: preflight 14 | attributes: 15 | label: 开始之前…… 16 | description: 让我们看看你准备好了吗?~ 17 | options: 18 | - label: 我已经认真阅读[说明文件(Githib)](https://github.com/xianyongjian080402/Minecraft-Optimal-Starter_2/blob/master/.github/ISSUE_TEMPLATE/ISSUE_GUIDELINES.md)/[说明文件(Gitee)](https://gitee.com/xian66/minecraft-optimal-starter_2/blob/master/.gitee/ISSUE_GUIDELINES.md) 19 | required: true 20 | - type: textarea 21 | id: description 22 | attributes: 23 | label: Bug描述 24 | description: 请描述你遇到的具体问题 25 | placeholder: 如:MOS启动器在运行时,出现了………… 26 | validations: 27 | required: true 28 | - type: textarea 29 | id: reproducing 30 | attributes: 31 | label: 复现方法(重现步骤) 32 | description: 你是如何触发这个错误的 33 | placeholder: | 34 | 1. 点击…… 35 | 2. 报错 36 | validations: 37 | required: true 38 | - type: textarea 39 | id: expected 40 | attributes: 41 | label: 期望的效果 42 | description: 你期盼发生的结果 43 | placeholder: 切换页面 44 | validations: 45 | required: true 46 | - type: textarea 47 | id: expected_2 48 | attributes: 49 | label: 实际效果 50 | description: 实际发生的结果 (如果在 “错误描述里” 写过了,可写“见上文”) 51 | placeholder: 程序闪退了 52 | validations: 53 | required: true 54 | - type: textarea 55 | id: screenshots 56 | attributes: 57 | label: 截图 58 | description: 如果有截图的话,在这里上传吧。 59 | validations: 60 | required: false 61 | - type: textarea 62 | id: logs 63 | attributes: 64 | label: 日志 65 | description: 如果有必要上传日志的话,在这里上传吧 (强烈建议上传) 66 | validations: 67 | required: false 68 | - type: textarea 69 | id: other 70 | attributes: 71 | label: 备注 72 | description: 在这里写上备注 73 | placeholder: 什么都可以哦,没有那就算了吧。 74 | validations: 75 | required: false 76 | - type: textarea 77 | id: other_2 78 | attributes: 79 | label: 留言 80 | description: 你还想告诉我们什么? 81 | placeholder: 什么都可以哦,没有那就算了吧。 82 | validations: 83 | required: false -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.yaml: -------------------------------------------------------------------------------- 1 | name: 提出一个新建议 2 | description: 在这里,你可以给本项目提出建议 3 | title: "[建议]" 4 | labels: ["recommendation"] 5 | assignees: 6 | - OasisAkari 7 | body: 8 | - type: markdown 9 | attributes: 10 | value: | 11 | 无论您提交的建议有多么简单, 也请严格按照 Issue 模板填写信息, 未正确套用模板或信息不全的将不做处理. 感谢配合 12 | - type: checkboxes 13 | id: preflight 14 | attributes: 15 | label: 开始之前…… 16 | description: 让我们看看你准备好了吗?~ 17 | options: 18 | - label: 我已经认真阅读[说明文件(Githib)](https://github.com/xianyongjian080402/Minecraft-Optimal-Starter_2/blob/master/.github/ISSUE_TEMPLATE/ISSUE_GUIDELINES.md)/[说明文件(Gitee)](https://gitee.com/xian66/minecraft-optimal-starter_2/blob/master/.gitee/ISSUE_GUIDELINES.md) 19 | required: true 20 | - type: textarea 21 | id: description 22 | attributes: 23 | label: 需求/意见说明 24 | description: 请说明你的建议 25 | placeholder: 添加………… 26 | validations: 27 | required: true 28 | - type: textarea 29 | id: description_2 30 | attributes: 31 | label: 建议描述 (详细) 32 | description: 请详细描述你的建议 33 | placeholder: 如:为MOS启动器添加………… 34 | validations: 35 | required: true 36 | - type: textarea 37 | id: description_3 38 | attributes: 39 | label: 解决什么痛点/带来什么收益 40 | description: 解决什么痛点/带来什么收益 41 | placeholder: 如:可以解决/有利于………… 42 | validations: 43 | required: true 44 | - type: textarea 45 | id: reproducing 46 | attributes: 47 | label: 实现方法 48 | description: 你认为,我可以怎么实现? 49 | placeholder: | 50 | 1. 先…… 51 | 2. 然后…… 52 | validations: 53 | required: false 54 | - type: textarea 55 | id: expected 56 | attributes: 57 | label: 要用到的API/库 58 | description: 为了实现,要用到的API/库 59 | placeholder: requests库/……的API 60 | validations: 61 | required: false 62 | - type: input 63 | id: expected_2 64 | attributes: 65 | label: 帮助文档 66 | description: 你有这个库/接口的帮助文档吗? (这有助于开发人员快速开发哦) 67 | placeholder: https://doc.qt.io/ 68 | validations: 69 | required: false 70 | - type: textarea 71 | id: other 72 | attributes: 73 | label: 备注 74 | description: 在这里写上备注 75 | placeholder: 什么都可以哦,没有那就算了吧。 76 | validations: 77 | required: false 78 | - type: textarea 79 | id: other_2 80 | attributes: 81 | label: 留言 82 | description: 你还想告诉我们什么? 83 | placeholder: 什么都可以哦,没有那就算了吧。 84 | validations: 85 | required: false -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 发布_打包 2 | MOS_1 3 | .DS_Store 4 | venv -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # 默认忽略的文件 2 | /shelf/ 3 | /workspace.xml 4 | -------------------------------------------------------------------------------- /.idea/MOS.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 14 | -------------------------------------------------------------------------------- /.idea/dictionaries/xyj.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/git_toolbox_prj.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 14 | 15 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | -------------------------------------------------------------------------------- /.idea/jsonSchemas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.qt_for_python/rcc/Java_Dowmloader.py: -------------------------------------------------------------------------------- 1 | # Resource object code (Python 3) 2 | # Created by: object code 3 | # Created by: The Resource Compiler for Qt version 6.3.0 4 | # WARNING! All changes made in this file will be lost! 5 | 6 | from PySide6 import QtCore 7 | 8 | qt_resource_data = b"\ 9 | \x00\x00\x00\xe4\ 10 | \x89\ 11 | PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ 12 | \x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\ 13 | \x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ 14 | \x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\x00\ 15 | \x8eIDATH\x89\xed\x93\xb1\x0d\xc3 \x10\x00\xef\ 16 | \xa3\xacC\xe4\x96\xc8\x05\xd9\xc2L\x93q<\x06\xae\x92\ 17 | \xde\x9e\x07\x91\xd6Q \x80q\xc9\xb5\xff\xba\x93x\x01\ 18 | \x9dN\x0e\xa5\xad\x1b\xc6\xc9\xa4\xe6\xd7V\xb9\x08\xc6{\ 19 | \x01Xb;\xd2*\x0f\x81e{\xcf\x8f\xd4\xde\xa1@\ 20 | \xa9\x1c\xe0\x92\x1a\x0c\xe3d\x94\xb6\xaeE\xfe7\xe0\xbd\ 21 | WG\ 35 | \x00O\ 36 | \x00K\x00.\x00p\x00n\x00g\ 37 | " 38 | 39 | qt_resource_struct = b"\ 40 | \x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\ 41 | \x00\x00\x00\x00\x00\x00\x00\x00\ 42 | \x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\ 43 | \x00\x00\x00\x00\x00\x00\x00\x00\ 44 | \x00\x00\x00\x0c\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ 45 | \x00\x00\x01\x82b\xf8l\xa2\ 46 | " 47 | 48 | def qInitResources(): 49 | QtCore.qRegisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data) 50 | 51 | def qCleanupResources(): 52 | QtCore.qUnregisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data) 53 | 54 | qInitResources() 55 | -------------------------------------------------------------------------------- /.qt_for_python/uic/2.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | ################################################################################ 4 | ## Form generated from reading UI file '2.ui' 5 | ## 6 | ## Created by: Qt User Interface Compiler version 6.3.0 7 | ## 8 | ## WARNING! All changes made in this file will be lost when recompiling UI file! 9 | ################################################################################ 10 | 11 | from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale, 12 | QMetaObject, QObject, QPoint, QRect, 13 | QSize, QTime, QUrl, Qt) 14 | from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, 15 | QFont, QFontDatabase, QGradient, QIcon, 16 | QImage, QKeySequence, QLinearGradient, QPainter, 17 | QPalette, QPixmap, QRadialGradient, QTransform) 18 | from PySide6.QtWidgets import (QApplication, QGridLayout, QLabel, QMainWindow, 19 | QPushButton, QSizePolicy, QSpacerItem, QWidget) 20 | 21 | class Ui_MainWindow(object): 22 | def setupUi(self, MainWindow): 23 | if not MainWindow.objectName(): 24 | MainWindow.setObjectName(u"MainWindow") 25 | MainWindow.resize(480, 180) 26 | MainWindow.setMinimumSize(QSize(480, 180)) 27 | MainWindow.setSizeIncrement(QSize(480, 180)) 28 | MainWindow.setBaseSize(QSize(480, 180)) 29 | MainWindow.setDocumentMode(False) 30 | MainWindow.setUnifiedTitleAndToolBarOnMac(False) 31 | self.centralwidget = QWidget(MainWindow) 32 | self.centralwidget.setObjectName(u"centralwidget") 33 | self.gridLayout = QGridLayout(self.centralwidget) 34 | self.gridLayout.setObjectName(u"gridLayout") 35 | self.pushButton = QPushButton(self.centralwidget) 36 | self.pushButton.setObjectName(u"pushButton") 37 | 38 | self.gridLayout.addWidget(self.pushButton, 1, 1, 1, 1) 39 | 40 | self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) 41 | 42 | self.gridLayout.addItem(self.horizontalSpacer, 1, 0, 1, 1) 43 | 44 | self.label = QLabel(self.centralwidget) 45 | self.label.setObjectName(u"label") 46 | 47 | self.gridLayout.addWidget(self.label, 0, 0, 1, 2) 48 | 49 | MainWindow.setCentralWidget(self.centralwidget) 50 | 51 | self.retranslateUi(MainWindow) 52 | self.pushButton.clicked.connect(MainWindow.close) 53 | 54 | QMetaObject.connectSlotsByName(MainWindow) 55 | # setupUi 56 | 57 | def retranslateUi(self, MainWindow): 58 | MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MOS\u9519\u8bef", None)) 59 | self.pushButton.setText(QCoreApplication.translate("MainWindow", u"\u9000\u51fa", None)) 60 | self.label.setText(QCoreApplication.translate("MainWindow", u"\u5f53\u524d\u76ee\u5f55\u65e0\u8bfb\u5199\u6743\u9650\uff0c\u65e0\u6cd5\u8fd0\u884cMOS", None)) 61 | # retranslateUi 62 | 63 | -------------------------------------------------------------------------------- /.qt_for_python/uic/Java_Dowmloader.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | ################################################################################ 4 | ## Form generated from reading UI file 'Java_Dowmloader.ui' 5 | ## 6 | ## Created by: Qt User Interface Compiler version 6.3.0 7 | ## 8 | ## WARNING! All changes made in this file will be lost when recompiling UI file! 9 | ################################################################################ 10 | 11 | from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale, 12 | QMetaObject, QObject, QPoint, QRect, 13 | QSize, QTime, QUrl, Qt) 14 | from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, 15 | QFont, QFontDatabase, QGradient, QIcon, 16 | QImage, QKeySequence, QLinearGradient, QPainter, 17 | QPalette, QPixmap, QRadialGradient, QTransform) 18 | from PySide6.QtWidgets import (QApplication, QGridLayout, QLabel, QMainWindow, 19 | QProgressBar, QPushButton, QScrollArea, QSizePolicy, 20 | QSpacerItem, QVBoxLayout, QWidget) 21 | 22 | class Ui_Java_Dowmloader(object): 23 | def setupUi(self, Java_Dowmloader): 24 | if not Java_Dowmloader.objectName(): 25 | Java_Dowmloader.setObjectName(u"Java_Dowmloader") 26 | Java_Dowmloader.resize(568, 255) 27 | Java_Dowmloader.setMinimumSize(QSize(568, 255)) 28 | Java_Dowmloader.setMaximumSize(QSize(568, 255)) 29 | Java_Dowmloader.setStyleSheet(u"background-color: rgb(255, 255, 255);") 30 | self.centralwidget = QWidget(Java_Dowmloader) 31 | self.centralwidget.setObjectName(u"centralwidget") 32 | self.verticalLayout = QVBoxLayout(self.centralwidget) 33 | self.verticalLayout.setObjectName(u"verticalLayout") 34 | self.label = QLabel(self.centralwidget) 35 | self.label.setObjectName(u"label") 36 | 37 | self.verticalLayout.addWidget(self.label) 38 | 39 | self.scrollArea = QScrollArea(self.centralwidget) 40 | self.scrollArea.setObjectName(u"scrollArea") 41 | self.scrollArea.setStyleSheet(u"QScrollArea{border-style:none;}\n" 42 | "QPushButton{border:2px solid rgba(235, 235, 235,0);height:25px;border-radius:5px;}\n" 43 | "QPushButton::hover{background-color: rgb(192, 192, 192);}\n" 44 | "QPushButton::pressed{background-color: rgb(169, 169, 169);}\n" 45 | "\n" 46 | "QProgressBar{\n" 47 | " text-align: center;border-style:none;border-radius:5px;background-color: rgb(235, 235, 235);height:3px;color: rgb(66, 66, 66);\n" 48 | "}\n" 49 | "QProgressBar::chunk{\n" 50 | " border-radius:5px;\n" 51 | " background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(64, 183, 255, 255), stop:1 rgba(67, 146, 255, 255));\n" 52 | "}") 53 | self.scrollArea.setWidgetResizable(True) 54 | self.scrollAreaWidgetContents = QWidget() 55 | self.scrollAreaWidgetContents.setObjectName(u"scrollAreaWidgetContents") 56 | self.scrollAreaWidgetContents.setGeometry(QRect(0, 0, 544, 207)) 57 | self.gridLayout = QGridLayout(self.scrollAreaWidgetContents) 58 | self.gridLayout.setObjectName(u"gridLayout") 59 | self.label_5 = QLabel(self.scrollAreaWidgetContents) 60 | self.label_5.setObjectName(u"label_5") 61 | 62 | self.gridLayout.addWidget(self.label_5, 6, 0, 1, 1) 63 | 64 | self.label_2 = QLabel(self.scrollAreaWidgetContents) 65 | self.label_2.setObjectName(u"label_2") 66 | 67 | self.gridLayout.addWidget(self.label_2, 0, 0, 1, 1) 68 | 69 | self.label_3 = QLabel(self.scrollAreaWidgetContents) 70 | self.label_3.setObjectName(u"label_3") 71 | 72 | self.gridLayout.addWidget(self.label_3, 2, 0, 1, 1) 73 | 74 | self.pushButton = QPushButton(self.scrollAreaWidgetContents) 75 | self.pushButton.setObjectName(u"pushButton") 76 | sizePolicy = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed) 77 | sizePolicy.setHorizontalStretch(0) 78 | sizePolicy.setVerticalStretch(0) 79 | sizePolicy.setHeightForWidth(self.pushButton.sizePolicy().hasHeightForWidth()) 80 | self.pushButton.setSizePolicy(sizePolicy) 81 | self.pushButton.setMinimumSize(QSize(150, 30)) 82 | self.pushButton.setMaximumSize(QSize(150, 30)) 83 | 84 | self.gridLayout.addWidget(self.pushButton, 6, 1, 1, 1) 85 | 86 | self.progressBar_2 = QProgressBar(self.scrollAreaWidgetContents) 87 | self.progressBar_2.setObjectName(u"progressBar_2") 88 | self.progressBar_2.setValue(5) 89 | self.progressBar_2.setTextVisible(False) 90 | self.progressBar_2.setInvertedAppearance(False) 91 | 92 | self.gridLayout.addWidget(self.progressBar_2, 3, 0, 1, 2) 93 | 94 | self.verticalSpacer = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding) 95 | 96 | self.gridLayout.addItem(self.verticalSpacer, 4, 0, 1, 2) 97 | 98 | self.progressBar = QProgressBar(self.scrollAreaWidgetContents) 99 | self.progressBar.setObjectName(u"progressBar") 100 | self.progressBar.setMinimum(0) 101 | self.progressBar.setMaximum(100) 102 | self.progressBar.setValue(50) 103 | self.progressBar.setTextVisible(False) 104 | 105 | self.gridLayout.addWidget(self.progressBar, 1, 0, 1, 2) 106 | 107 | self.scrollArea.setWidget(self.scrollAreaWidgetContents) 108 | 109 | self.verticalLayout.addWidget(self.scrollArea) 110 | 111 | Java_Dowmloader.setCentralWidget(self.centralwidget) 112 | 113 | self.retranslateUi(Java_Dowmloader) 114 | 115 | QMetaObject.connectSlotsByName(Java_Dowmloader) 116 | # setupUi 117 | 118 | def retranslateUi(self, Java_Dowmloader): 119 | Java_Dowmloader.setWindowTitle(QCoreApplication.translate("Java_Dowmloader", u"Java_Dowmloader", None)) 120 | self.label.setText(QCoreApplication.translate("Java_Dowmloader", u"\u6b63\u5728\u4e0b\u8f7dJava", None)) 121 | self.label_5.setText(QCoreApplication.translate("Java_Dowmloader", u"0 MB/S", None)) 122 | self.label_2.setText(QCoreApplication.translate("Java_Dowmloader", u"\u4e0b\u8f7dJava", None)) 123 | self.label_3.setText(QCoreApplication.translate("Java_Dowmloader", u"\u914d\u7f6eJava", None)) 124 | self.pushButton.setText(QCoreApplication.translate("Java_Dowmloader", u"\u53d6\u6d88", None)) 125 | # retranslateUi 126 | 127 | -------------------------------------------------------------------------------- /.qt_for_python/uic/Java_Dowmloader_OK_UI.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | ################################################################################ 4 | ## Form generated from reading UI file 'Java_Dowmloader_OK_UI.ui' 5 | ## 6 | ## Created by: Qt User Interface Compiler version 6.3.0 7 | ## 8 | ## WARNING! All changes made in this file will be lost when recompiling UI file! 9 | ################################################################################ 10 | 11 | from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale, 12 | QMetaObject, QObject, QPoint, QRect, 13 | QSize, QTime, QUrl, Qt) 14 | from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, 15 | QFont, QFontDatabase, QGradient, QIcon, 16 | QImage, QKeySequence, QLinearGradient, QPainter, 17 | QPalette, QPixmap, QRadialGradient, QTransform) 18 | from PySide6.QtWidgets import (QApplication, QDialog, QGridLayout, QLabel, 19 | QPushButton, QSizePolicy, QSpacerItem, QWidget) 20 | import Java_Dowmloader_rc 21 | 22 | class Ui_Dialog_2(object): 23 | def setupUi(self, Dialog_2): 24 | if not Dialog_2.objectName(): 25 | Dialog_2.setObjectName(u"Dialog_2") 26 | Dialog_2.resize(505, 120) 27 | Dialog_2.setMinimumSize(QSize(505, 120)) 28 | Dialog_2.setMaximumSize(QSize(505, 120)) 29 | Dialog_2.setStyleSheet(u"QDialog{background-color: rgb(255, 255, 255);}\n" 30 | "#pushButton{border:2px solid rgba(235, 235, 235,0);height:25px;border-radius:5px;}\n" 31 | "#pushButton::hover{background-color: rgb(192, 192, 192);}\n" 32 | "#pushButton::pressed{background-color: rgb(169, 169, 169);}\n" 33 | "\n" 34 | "#pushButton_2{background-color: rgba(255, 255, 255, 0);}") 35 | self.gridLayout = QGridLayout(Dialog_2) 36 | self.gridLayout.setObjectName(u"gridLayout") 37 | self.pushButton = QPushButton(Dialog_2) 38 | self.pushButton.setObjectName(u"pushButton") 39 | self.pushButton.setMinimumSize(QSize(100, 30)) 40 | self.pushButton.setStyleSheet(u"font-size: 14px;") 41 | 42 | self.gridLayout.addWidget(self.pushButton, 2, 3, 1, 1) 43 | 44 | self.label_2 = QLabel(Dialog_2) 45 | self.label_2.setObjectName(u"label_2") 46 | self.label_2.setStyleSheet(u"font-size: 16px;") 47 | self.label_2.setMargin(0) 48 | self.label_2.setIndent(2) 49 | 50 | self.gridLayout.addWidget(self.label_2, 0, 2, 1, 2) 51 | 52 | self.label = QLabel(Dialog_2) 53 | self.label.setObjectName(u"label") 54 | self.label.setStyleSheet(u"font-size: 14px;") 55 | 56 | self.gridLayout.addWidget(self.label, 1, 2, 1, 2) 57 | 58 | self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) 59 | 60 | self.gridLayout.addItem(self.horizontalSpacer, 2, 1, 1, 2) 61 | 62 | self.pushButton_2 = QPushButton(Dialog_2) 63 | self.pushButton_2.setObjectName(u"pushButton_2") 64 | self.pushButton_2.setMinimumSize(QSize(50, 50)) 65 | self.pushButton_2.setMaximumSize(QSize(50, 50)) 66 | icon = QIcon() 67 | icon.addFile(u":/ing/OK.png", QSize(), QIcon.Normal, QIcon.Off) 68 | self.pushButton_2.setIcon(icon) 69 | self.pushButton_2.setIconSize(QSize(40, 40)) 70 | 71 | self.gridLayout.addWidget(self.pushButton_2, 0, 1, 2, 1) 72 | 73 | 74 | self.retranslateUi(Dialog_2) 75 | 76 | QMetaObject.connectSlotsByName(Dialog_2) 77 | # setupUi 78 | 79 | def retranslateUi(self, Dialog_2): 80 | Dialog_2.setWindowTitle(QCoreApplication.translate("Dialog_2", u"Dialog", None)) 81 | self.pushButton.setText(QCoreApplication.translate("Dialog_2", u"\u597d\u7684", None)) 82 | self.label_2.setText(QCoreApplication.translate("Dialog_2", u"\u63d0\u793a", None)) 83 | self.label.setText(QCoreApplication.translate("Dialog_2", u"\u4e0b\u8f7d&\u914d\u7f6eJava\u5b8c\u6210", None)) 84 | self.pushButton_2.setText("") 85 | # retranslateUi 86 | 87 | -------------------------------------------------------------------------------- /.qt_for_python/uic/Java_Dowmloader_UI.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | ################################################################################ 4 | ## Form generated from reading UI file 'Java_Dowmloader_UI.ui' 5 | ## 6 | ## Created by: Qt User Interface Compiler version 6.3.0 7 | ## 8 | ## WARNING! All changes made in this file will be lost when recompiling UI file! 9 | ################################################################################ 10 | 11 | from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale, 12 | QMetaObject, QObject, QPoint, QRect, 13 | QSize, QTime, QUrl, Qt) 14 | from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, 15 | QFont, QFontDatabase, QGradient, QIcon, 16 | QImage, QKeySequence, QLinearGradient, QPainter, 17 | QPalette, QPixmap, QRadialGradient, QTransform) 18 | from PySide6.QtWidgets import (QApplication, QDialog, QGridLayout, QLabel, 19 | QProgressBar, QPushButton, QScrollArea, QSizePolicy, 20 | QSpacerItem, QVBoxLayout, QWidget) 21 | import Java_Dowmloader_rc 22 | 23 | class Ui_Dialog(object): 24 | def setupUi(self, Dialog): 25 | if not Dialog.objectName(): 26 | Dialog.setObjectName(u"Dialog") 27 | Dialog.resize(568, 255) 28 | Dialog.setMinimumSize(QSize(568, 255)) 29 | Dialog.setMaximumSize(QSize(568, 255)) 30 | Dialog.setStyleSheet(u"background-color: rgb(255, 255, 255);") 31 | self.verticalLayout = QVBoxLayout(Dialog) 32 | self.verticalLayout.setObjectName(u"verticalLayout") 33 | self.label = QLabel(Dialog) 34 | self.label.setObjectName(u"label") 35 | 36 | self.verticalLayout.addWidget(self.label) 37 | 38 | self.scrollArea = QScrollArea(Dialog) 39 | self.scrollArea.setObjectName(u"scrollArea") 40 | self.scrollArea.setStyleSheet(u"QScrollArea{border-style:none;}\n" 41 | "QPushButton{border:2px solid rgba(235, 235, 235,0);height:25px;border-radius:5px;}\n" 42 | "QPushButton::hover{background-color: rgb(192, 192, 192);}\n" 43 | "QPushButton::pressed{background-color: rgb(169, 169, 169);}\n" 44 | "\n" 45 | "QProgressBar{\n" 46 | " text-align: center;border-style:none;border-radius:5px;background-color: rgb(235, 235, 235);height:3px;color: rgb(66, 66, 66);\n" 47 | "}\n" 48 | "QProgressBar::chunk{\n" 49 | " border-radius:5px;\n" 50 | " background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(64, 183, 255, 255), stop:1 rgba(67, 146, 255, 255));\n" 51 | "}") 52 | self.scrollArea.setWidgetResizable(True) 53 | self.scrollAreaWidgetContents = QWidget() 54 | self.scrollAreaWidgetContents.setObjectName(u"scrollAreaWidgetContents") 55 | self.scrollAreaWidgetContents.setGeometry(QRect(0, 0, 544, 207)) 56 | self.gridLayout = QGridLayout(self.scrollAreaWidgetContents) 57 | self.gridLayout.setObjectName(u"gridLayout") 58 | self.label_2 = QLabel(self.scrollAreaWidgetContents) 59 | self.label_2.setObjectName(u"label_2") 60 | 61 | self.gridLayout.addWidget(self.label_2, 0, 0, 1, 1) 62 | 63 | self.label_3 = QLabel(self.scrollAreaWidgetContents) 64 | self.label_3.setObjectName(u"label_3") 65 | 66 | self.gridLayout.addWidget(self.label_3, 2, 0, 1, 1) 67 | 68 | self.verticalSpacer = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding) 69 | 70 | self.gridLayout.addItem(self.verticalSpacer, 4, 0, 1, 2) 71 | 72 | self.label_5 = QLabel(self.scrollAreaWidgetContents) 73 | self.label_5.setObjectName(u"label_5") 74 | 75 | self.gridLayout.addWidget(self.label_5, 5, 0, 1, 1) 76 | 77 | self.pushButton = QPushButton(self.scrollAreaWidgetContents) 78 | self.pushButton.setObjectName(u"pushButton") 79 | sizePolicy = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed) 80 | sizePolicy.setHorizontalStretch(0) 81 | sizePolicy.setVerticalStretch(0) 82 | sizePolicy.setHeightForWidth(self.pushButton.sizePolicy().hasHeightForWidth()) 83 | self.pushButton.setSizePolicy(sizePolicy) 84 | self.pushButton.setMinimumSize(QSize(150, 30)) 85 | self.pushButton.setMaximumSize(QSize(150, 30)) 86 | 87 | self.gridLayout.addWidget(self.pushButton, 5, 1, 1, 1) 88 | 89 | self.progressBar = QProgressBar(self.scrollAreaWidgetContents) 90 | self.progressBar.setObjectName(u"progressBar") 91 | self.progressBar.setMinimum(0) 92 | self.progressBar.setMaximum(110) 93 | self.progressBar.setValue(50) 94 | self.progressBar.setTextVisible(False) 95 | 96 | self.gridLayout.addWidget(self.progressBar, 1, 0, 1, 2) 97 | 98 | self.progressBar_2 = QProgressBar(self.scrollAreaWidgetContents) 99 | self.progressBar_2.setObjectName(u"progressBar_2") 100 | self.progressBar_2.setValue(5) 101 | self.progressBar_2.setTextVisible(False) 102 | self.progressBar_2.setInvertedAppearance(False) 103 | 104 | self.gridLayout.addWidget(self.progressBar_2, 3, 0, 1, 2) 105 | 106 | self.scrollArea.setWidget(self.scrollAreaWidgetContents) 107 | 108 | self.verticalLayout.addWidget(self.scrollArea) 109 | 110 | 111 | self.retranslateUi(Dialog) 112 | 113 | QMetaObject.connectSlotsByName(Dialog) 114 | # setupUi 115 | 116 | def retranslateUi(self, Dialog): 117 | Dialog.setWindowTitle(QCoreApplication.translate("Dialog", u"Dialog", None)) 118 | self.label.setText(QCoreApplication.translate("Dialog", u"\u6b63\u5728\u4e0b\u8f7dJava", None)) 119 | self.label_2.setText(QCoreApplication.translate("Dialog", u"\u4e0b\u8f7dJava", None)) 120 | self.label_3.setText(QCoreApplication.translate("Dialog", u"\u914d\u7f6eJava", None)) 121 | self.label_5.setText(QCoreApplication.translate("Dialog", u"0 MB/S - \u6b63\u5728\u51c6\u5907\u4e0b\u8f7d", None)) 122 | self.pushButton.setText(QCoreApplication.translate("Dialog", u"\u53d6\u6d88", None)) 123 | # retranslateUi 124 | 125 | -------------------------------------------------------------------------------- /.qt_for_python/uic/MOS_start_loading.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | ################################################################################ 4 | ## Form generated from reading UI file 'MOS_start_loading.ui' 5 | ## 6 | ## Created by: Qt User Interface Compiler version 6.3.0 7 | ## 8 | ## WARNING! All changes made in this file will be lost when recompiling UI file! 9 | ################################################################################ 10 | 11 | from PySide6.QtCore import (QCoreApplication, QMetaObject, QSize, Qt) 12 | from PySide6.QtGui import (QCursor) 13 | from PySide6.QtWidgets import (QGridLayout, QLabel, QMainWindow, 14 | QSizePolicy, QTabWidget, QWidget) 15 | 16 | 17 | class Ui_MainWindow(object): 18 | def setupUi(self, MainWindow): 19 | if not MainWindow.objectName(): 20 | MainWindow.setObjectName(u"MainWindow") 21 | MainWindow.setEnabled(True) 22 | MainWindow.resize(175, 175) 23 | MainWindow.setMinimumSize(QSize(175, 175)) 24 | MainWindow.setMaximumSize(QSize(175, 175)) 25 | MainWindow.setCursor(QCursor(Qt.WaitCursor)) 26 | MainWindow.setMouseTracking(True) 27 | MainWindow.setWindowOpacity(1.000000000000000) 28 | MainWindow.setToolTipDuration(0) 29 | MainWindow.setStyleSheet(u"") 30 | MainWindow.setIconSize(QSize(100, 100)) 31 | MainWindow.setTabShape(QTabWidget.Rounded) 32 | MainWindow.setDockOptions(QMainWindow.AllowTabbedDocks|QMainWindow.AnimatedDocks) 33 | MainWindow.setUnifiedTitleAndToolBarOnMac(False) 34 | self.centralwidget = QWidget(MainWindow) 35 | self.centralwidget.setObjectName(u"centralwidget") 36 | self.gridLayout = QGridLayout(self.centralwidget) 37 | self.gridLayout.setSpacing(0) 38 | self.gridLayout.setObjectName(u"gridLayout") 39 | self.gridLayout.setContentsMargins(0, 0, 0, 0) 40 | self.label = QLabel(self.centralwidget) 41 | self.label.setObjectName(u"label") 42 | sizePolicy = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred) 43 | sizePolicy.setHorizontalStretch(0) 44 | sizePolicy.setVerticalStretch(0) 45 | sizePolicy.setHeightForWidth(self.label.sizePolicy().hasHeightForWidth()) 46 | self.label.setSizePolicy(sizePolicy) 47 | self.label.setFocusPolicy(Qt.NoFocus) 48 | self.label.setStyleSheet(u"border-image: url(:/img/ico.png);") 49 | 50 | self.gridLayout.addWidget(self.label, 0, 0, 1, 1) 51 | 52 | MainWindow.setCentralWidget(self.centralwidget) 53 | 54 | self.retranslateUi(MainWindow) 55 | 56 | QMetaObject.connectSlotsByName(MainWindow) 57 | # setupUi 58 | 59 | def retranslateUi(self, MainWindow): 60 | MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None)) 61 | self.label.setText(QCoreApplication.translate("MainWindow", u"


", None)) 62 | # retranslateUi 63 | 64 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "workbench.colorCustomizations": {}, 3 | "python.testing.pytestArgs": [ 4 | "." 5 | ], 6 | "python.testing.unittestEnabled": true, 7 | "python.testing.pytestEnabled": false, 8 | "python.testing.unittestArgs": [ 9 | "-v", 10 | "-s", 11 | ".", 12 | "-p", 13 | "*test.py" 14 | ] 15 | } -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | We as members, contributors, and leaders pledge to make participation in our 6 | community a harassment-free experience for everyone, regardless of age, body 7 | size, visible or invisible disability, ethnicity, sex characteristics, gender 8 | identity and expression, level of experience, education, socio-economic status, 9 | nationality, personal appearance, race, religion, or sexual identity 10 | and orientation. 11 | 12 | We pledge to act and interact in ways that contribute to an open, welcoming, 13 | diverse, inclusive, and healthy community. 14 | 15 | ## Our Standards 16 | 17 | Examples of behavior that contributes to a positive environment for our 18 | community include: 19 | 20 | * Demonstrating empathy and kindness toward other people 21 | * Being respectful of differing opinions, viewpoints, and experiences 22 | * Giving and gracefully accepting constructive feedback 23 | * Accepting responsibility and apologizing to those affected by our mistakes, 24 | and learning from the experience 25 | * Focusing on what is best not just for us as individuals, but for the 26 | overall community 27 | 28 | Examples of unacceptable behavior include: 29 | 30 | * The use of sexualized language or imagery, and sexual attention or 31 | advances of any kind 32 | * Trolling, insulting or derogatory comments, and personal or political attacks 33 | * Public or private harassment 34 | * Publishing others' private information, such as a physical or email 35 | address, without their explicit permission 36 | * Other conduct which could reasonably be considered inappropriate in a 37 | professional setting 38 | 39 | ## Enforcement Responsibilities 40 | 41 | Community leaders are responsible for clarifying and enforcing our standards of 42 | acceptable behavior and will take appropriate and fair corrective action in 43 | response to any behavior that they deem inappropriate, threatening, offensive, 44 | or harmful. 45 | 46 | Community leaders have the right and responsibility to remove, edit, or reject 47 | comments, commits, code, wiki edits, issues, and other contributions that are 48 | not aligned to this Code of Conduct, and will communicate reasons for moderation 49 | decisions when appropriate. 50 | 51 | ## Scope 52 | 53 | This Code of Conduct applies within all community spaces, and also applies when 54 | an individual is officially representing the community in public spaces. 55 | Examples of representing our community include using an official e-mail address, 56 | posting via an official social media account, or acting as an appointed 57 | representative at an online or offline event. 58 | 59 | ## Enforcement 60 | 61 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 62 | reported to the community leaders responsible for enforcement at 63 | xianyongjian080402@163.com. 64 | All complaints will be reviewed and investigated promptly and fairly. 65 | 66 | All community leaders are obligated to respect the privacy and security of the 67 | reporter of any incident. 68 | 69 | ## Enforcement Guidelines 70 | 71 | Community leaders will follow these Community Impact Guidelines in determining 72 | the consequences for any action they deem in violation of this Code of Conduct: 73 | 74 | ### 1. Correction 75 | 76 | **Community Impact**: Use of inappropriate language or other behavior deemed 77 | unprofessional or unwelcome in the community. 78 | 79 | **Consequence**: A private, written warning from community leaders, providing 80 | clarity around the nature of the violation and an explanation of why the 81 | behavior was inappropriate. A public apology may be requested. 82 | 83 | ### 2. Warning 84 | 85 | **Community Impact**: A violation through a single incident or series 86 | of actions. 87 | 88 | **Consequence**: A warning with consequences for continued behavior. No 89 | interaction with the people involved, including unsolicited interaction with 90 | those enforcing the Code of Conduct, for a specified period of time. This 91 | includes avoiding interactions in community spaces as well as external channels 92 | like social media. Violating these terms may lead to a temporary or 93 | permanent ban. 94 | 95 | ### 3. Temporary Ban 96 | 97 | **Community Impact**: A serious violation of community standards, including 98 | sustained inappropriate behavior. 99 | 100 | **Consequence**: A temporary ban from any sort of interaction or public 101 | communication with the community for a specified period of time. No public or 102 | private interaction with the people involved, including unsolicited interaction 103 | with those enforcing the Code of Conduct, is allowed during this period. 104 | Violating these terms may lead to a permanent ban. 105 | 106 | ### 4. Permanent Ban 107 | 108 | **Community Impact**: Demonstrating a pattern of violation of community 109 | standards, including sustained inappropriate behavior, harassment of an 110 | individual, or aggression toward or disparagement of classes of individuals. 111 | 112 | **Consequence**: A permanent ban from any sort of public interaction within 113 | the community. 114 | 115 | ## Attribution 116 | 117 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], 118 | version 2.0, available at 119 | https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. 120 | 121 | Community Impact Guidelines were inspired by [Mozilla's code of conduct 122 | enforcement ladder](https://github.com/mozilla/diversity). 123 | 124 | [homepage]: https://www.contributor-covenant.org 125 | 126 | For answers to common questions about this code of conduct, see the FAQ at 127 | https://www.contributor-covenant.org/faq. Translations are available at 128 | https://www.contributor-covenant.org/translations. 129 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /Delete_Game_F.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | from Delete_Game_F_UI import Ui_Delete_Game_F_UI_J 3 | 4 | from PyQt6.QtWidgets import QApplication, QLabel,QDialogButtonBox,QDialog 5 | from PyQt6.QtCore import QPropertyAnimation, QTimer,QThread,pyqtSignal 6 | from PyQt6 import QtWidgets,QtCore 7 | 8 | class Ui_Delete_Game_F_J(QDialog, Ui_Delete_Game_F_UI_J): 9 | def __init__(self): 10 | super(Ui_Delete_Game_F_J, self).__init__() 11 | self.setupUi(self) 12 | self.pushButton.clicked.connect(self.clicked_pushButton_close) 13 | self.show() 14 | def run(self): 15 | pass 16 | 17 | def clicked_pushButton_close(self): 18 | self.pushButton.setEnabled(False) #为了防止重复操作 直接禁用按钮 19 | self.anim = QPropertyAnimation(self, b"windowOpacity") # 设置动画对象 20 | self.anim.setDuration(300) # 设置动画时长 21 | self.anim.setStartValue(1) # 设置初始属性,1.0为不透明 22 | self.anim.setEndValue(0) # 设置结束属性,0为完全透明 23 | self.anim.finished.connect(self.close_) # 动画结束时,关闭窗口 24 | self.anim.start() # 开始动画 25 | 26 | 27 | def close_(self): 28 | self.close() -------------------------------------------------------------------------------- /Delete_Game_F_UI.py: -------------------------------------------------------------------------------- 1 | # Form implementation generated from reading ui file '/Users/xyj/.npm/ssh/UI/UI/Delete_Game_F_UI.ui' 2 | # 3 | # Created by: PyQt6 UI code generator 6.3.1 4 | # 5 | # WARNING: Any manual changes made to this file will be lost when pyuic6 is 6 | # run again. Do not edit this file unless you know what you are doing. 7 | 8 | 9 | from PyQt6 import QtCore, QtGui, QtWidgets 10 | 11 | 12 | class Ui_Delete_Game_F_UI_J(object): 13 | def setupUi(self, Delete_Game_F_UI_J): 14 | Delete_Game_F_UI_J.setObjectName("Delete_Game_F_UI_J") 15 | Delete_Game_F_UI_J.resize(622, 127) 16 | Delete_Game_F_UI_J.setMinimumSize(QtCore.QSize(622, 127)) 17 | Delete_Game_F_UI_J.setMaximumSize(QtCore.QSize(622, 127)) 18 | Delete_Game_F_UI_J.setStyleSheet("QDialog{background-color: rgb(255, 255, 255);}\n" 19 | "#pushButton{border:2px solid rgba(235, 235, 235,0);height:25px;border-radius:5px;}\n" 20 | "#pushButton::hover{background-color: rgb(192, 192, 192);}\n" 21 | "#pushButton::pressed{background-color: rgb(169, 169, 169);}\n" 22 | "\n" 23 | "#pushButton_2{background-color: rgba(255, 255, 255, 0);}\n" 24 | "\n" 25 | "#pushButton_3{border:2px solid rgba(235, 235, 235,0);height:25px;border-radius:5px;}\n" 26 | "#pushButton_3::hover{background-color: rgb(192, 192, 192);}\n" 27 | "#pushButton_3::pressed{background-color: rgb(169, 169, 169);}") 28 | self.gridLayout = QtWidgets.QGridLayout(Delete_Game_F_UI_J) 29 | self.gridLayout.setObjectName("gridLayout") 30 | self.pushButton = QtWidgets.QPushButton(Delete_Game_F_UI_J) 31 | self.pushButton.setMinimumSize(QtCore.QSize(100, 30)) 32 | self.pushButton.setStyleSheet("font-size: 14px;") 33 | self.pushButton.setObjectName("pushButton") 34 | self.gridLayout.addWidget(self.pushButton, 2, 4, 1, 3) 35 | self.label_2 = QtWidgets.QLabel(Delete_Game_F_UI_J) 36 | self.label_2.setStyleSheet("font-size: 16px;") 37 | self.label_2.setIndent(2) 38 | self.label_2.setObjectName("label_2") 39 | self.gridLayout.addWidget(self.label_2, 0, 1, 1, 6) 40 | self.pushButton_2 = QtWidgets.QPushButton(Delete_Game_F_UI_J) 41 | self.pushButton_2.setMinimumSize(QtCore.QSize(50, 50)) 42 | self.pushButton_2.setMaximumSize(QtCore.QSize(50, 50)) 43 | self.pushButton_2.setText("") 44 | icon = QtGui.QIcon() 45 | MOS_catalogue_picture_trash_red_png = os.path.join("picture", "trash_red.png") 46 | icon.addPixmap(QtGui.QPixmap(MOS_catalogue_picture_trash_red_png), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) 47 | self.pushButton_2.setIcon(icon) 48 | self.pushButton_2.setIconSize(QtCore.QSize(40, 40)) 49 | self.pushButton_2.setObjectName("pushButton_2") 50 | self.gridLayout.addWidget(self.pushButton_2, 0, 0, 2, 1) 51 | spacerItem = QtWidgets.QSpacerItem(434, 27, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) 52 | self.gridLayout.addItem(spacerItem, 2, 0, 1, 3) 53 | self.label = QtWidgets.QLabel(Delete_Game_F_UI_J) 54 | self.label.setStyleSheet("font-size: 14px;") 55 | self.label.setWordWrap(True) 56 | self.label.setObjectName("label") 57 | self.gridLayout.addWidget(self.label, 1, 1, 1, 6) 58 | self.pushButton_3 = QtWidgets.QPushButton(Delete_Game_F_UI_J) 59 | self.pushButton_3.setMinimumSize(QtCore.QSize(100, 30)) 60 | self.pushButton_3.setObjectName("pushButton_3") 61 | self.gridLayout.addWidget(self.pushButton_3, 2, 3, 1, 1) 62 | 63 | self.retranslateUi(Delete_Game_F_UI_J) 64 | QtCore.QMetaObject.connectSlotsByName(Delete_Game_F_UI_J) 65 | 66 | def retranslateUi(self, Delete_Game_F_UI_J): 67 | _translate = QtCore.QCoreApplication.translate 68 | Delete_Game_F_UI_J.setWindowTitle(_translate("Delete_Game_F_UI_J", "Dialog")) 69 | self.pushButton.setText(_translate("Delete_Game_F_UI_J", "确定")) 70 | self.label_2.setText(_translate("Delete_Game_F_UI_J", "警告")) 71 | self.label.setText(_translate("Delete_Game_F_UI_J", "您确定要删除游戏文件夹吗 这将不会显示在您的游戏列表中 您可以重新添加")) 72 | self.pushButton_3.setText(_translate("Delete_Game_F_UI_J", "取消")) 73 | -------------------------------------------------------------------------------- /Download/1.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import shutil 3 | 4 | '''不推荐用这个写法''' 5 | 6 | def download_file(url): 7 | local_filename = url.split('/')[-1] 8 | with requests.get(url, stream=True) as r: 9 | with open(local_filename, 'wb') as f: 10 | shutil.copyfileobj(r.raw, f) 11 | 12 | return local_filename 13 | 14 | #url = 'https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/0d/ea/f936c14b6e886221e53354e1992d0c4e0eb9566fcc70201047bb664ce777/tensorflow-2.3.1-cp37-cp37m-macosx_10_9_x86_64.whl#sha256=1f72edee9d2e8861edbb9e082608fd21de7113580b3fdaa4e194b472c2e196d0' 15 | #url = 'https://download.visualstudio.microsoft.com/download/pr/cc04076c-d188-4c20-9b4f-89be06f1a39c/32da746ef46fbeedb4f609b67cb451c3/windowsdesktop-runtime-6.0.6-win-x86.exe' 16 | #url = 'https://visualstudio.microsoft.com/aabf4bb0-b5f4-4e42-8aae-6ad17ec46db2' 17 | #url = 'https://file.skyworldstudio.top/d/SoftwareRelease/MOS/Publish/2.0.4-alpha/2.0.4-alpha-win.zip' 18 | url = 'https://download.visualstudio.microsoft.com/download/pr/ca7c7580-dd29-42d8-a0b1-3223e61f1623/b38739f51587806a5751419435d6c4ad/visualstudioformacinstaller-17.0.4.5.dmg' 19 | 20 | download_file(url) -------------------------------------------------------------------------------- /Download/2.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Time : 2020/5/5 22:18 3 | # @Author: 哦嚯嚯哦 4 | # @File : test_demo.py 5 | # @tool : PyCharm 6 | 7 | """ 8 | 使用python实现百行代码高速下载,同IDM 9 | """ 10 | """建议用这个 经过我测试 这个最稳定 经常是最快的""" 11 | import os 12 | import time 13 | import sys 14 | from requests import get,head 15 | from concurrent.futures import ThreadPoolExecutor,wait 16 | 17 | 18 | class Dowmloader: 19 | def __init__(self, url, nums, file): 20 | self.url = url # url链接 21 | self.num = nums # 线程数 22 | self.name = file # 文件名字 23 | self.getSize = 0 # 大小 24 | self.info = { 25 | 'main': { 26 | 'progress': 0, 27 | 'speed': '' 28 | }, 29 | 'sub': { 30 | 'progress': [0 for i in range(nums)], # 子线程状态 31 | 'stat': [1 for i in range(nums)] # 下载状态 32 | } 33 | } 34 | r = head(self.url) 35 | # 状态码显示302则迭代寻找文件 36 | while r.status_code == 302: 37 | self.url = r.headers['Location'] 38 | print("此url已重定向至{}".format(self.url)) 39 | r = head(self.url) 40 | self.size = int(r.headers['Content-Length']) 41 | print('该文件大小为: {} bytes'.format(self.size)) 42 | 43 | def down(self, start, end, thread_id, chunk_size = 10240): 44 | raw_start = start 45 | for _ in range(10): 46 | try: 47 | headers = {'Range': 'bytes={}-{}'.format(start, end)} 48 | r = get(self.url, headers=headers, timeout=10, stream=True) 49 | print(f"线程{thread_id}连接成功") 50 | size = 0 51 | with open(self.name, "rb+") as fp: 52 | fp.seek(start) 53 | for chunk in r.iter_content(chunk_size=chunk_size): 54 | if chunk: 55 | self.getSize += chunk_size 56 | fp.write(chunk) 57 | start += chunk_size 58 | size += chunk_size 59 | progress = round(size / (end - raw_start) * 100, 2) 60 | self.info['sub']['progress'][thread_id - 1] = progress 61 | self.info['sub']['stat'][thread_id - 1] = 1 62 | return 63 | except Exception as error: 64 | print(error) 65 | self.down(start, end, thread_id) 66 | print(f"{start}-{end}, 下载失败") 67 | self.info['sub']['start'][thread_id - 1] = 0 68 | 69 | def show(self): 70 | while True: 71 | speed = self.getSize 72 | time.sleep(0.5) 73 | speed = int((self.getSize - speed) * 2 / 1024) 74 | if speed > 1024: 75 | speed = f"{round(speed / 1024, 2)} M/s" 76 | else: 77 | speed = f"{speed} KB/s" 78 | progress = round(self.getSize / self.size * 100, 2) 79 | self.info['main']['progress'] = progress 80 | self.info['main']['speed'] = speed 81 | print(self.info) 82 | if progress >= 100: 83 | break 84 | 85 | def run(self): 86 | # 创建一个要下载的文件 87 | fp = open(self.name, 'wb') 88 | print(f"正在初始化下载文件: {self.name}") 89 | fp.truncate(self.size) 90 | print(f"文件初始化完成") 91 | start_time = time.time() 92 | fp.close() 93 | part = self.size // self.num 94 | pool = ThreadPoolExecutor(max_workers=self.num + 1) 95 | futures = [] 96 | for i in range(self.num): 97 | start = part * i 98 | if i == self.num - 1: 99 | end = self.size 100 | else: 101 | end = start + part - 1 102 | futures.append(pool.submit(self.down, start, end, i + 1)) 103 | futures.append(pool.submit(self.show)) 104 | print(f"正在使用{self.num}个线程进行下载...") 105 | 106 | start = time.perf_counter() 107 | 108 | wait(futures) 109 | end_time = time.time() 110 | speed = int(self.size / 1024 / (end_time - start_time)) 111 | if speed > 1024: 112 | speed = f"{round(speed / 1024, 2)} M/s" 113 | else: 114 | speed = f"{speed} KB/s" 115 | print(f"{self.name}下载完成,平均速度: {speed}") 116 | 117 | end_time_1 = time.perf_counter() 118 | print(end_time_1) 119 | 120 | if __name__ == '__main__': 121 | debug = 1 # 测试情况 122 | if debug: 123 | #url = 'https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/0d/ea/f936c14b6e886221e53354e1992d0c4e0eb9566fcc70201047bb664ce777/tensorflow-2.3.1-cp37-cp37m-macosx_10_9_x86_64.whl#sha256=1f72edee9d2e8861edbb9e082608fd21de7113580b3fdaa4e194b472c2e196d0' 124 | #url = 'https://download.visualstudio.microsoft.com/download/pr/cc04076c-d188-4c20-9b4f-89be06f1a39c/32da746ef46fbeedb4f609b67cb451c3/windowsdesktop-runtime-6.0.6-win-x86.exe' 125 | #url = 'https://visualstudio.microsoft.com/aabf4bb0-b5f4-4e42-8aae-6ad17ec46db2' 126 | #url = 'https://file.skyworldstudio.top/d/SoftwareRelease/MOS/Publish/2.0.4-alpha/2.0.4-alpha-win.zip' 127 | url = 'https://download.visualstudio.microsoft.com/download/pr/ca7c7580-dd29-42d8-a0b1-3223e61f1623/b38739f51587806a5751419435d6c4ad/visualstudioformacinstaller-17.0.4.5.dmg' 128 | #url = 'https://file.skyworldstudio.top/d/MSJM/S2/Vanilla/vanilla-1.9.jar' 129 | down = Dowmloader(url, 8, os.path.basename(url)) 130 | else: 131 | # 命令行执行方式 132 | url = sys.argv[1] # 下载链接 133 | file = sys.argv[2] # 默认保存在项目路径下,文件的名字以文件格式结尾 134 | thread_num = int(sys.argv[3]) # 使用的线程数量 135 | down = Dowmloader(url, thread_num, file) 136 | down.run() 137 | -------------------------------------------------------------------------------- /Download/3.py: -------------------------------------------------------------------------------- 1 | """自动建立多线程的写法,文件越大 线程越多 性能可能下降 一开始很快 到后面掉速严重""" 2 | 3 | from __future__ import annotations 4 | # 用于显示进度条 5 | from tqdm import tqdm 6 | # 用于发起网络请求 7 | import requests 8 | # 用于多线程操作 9 | import multitasking 10 | import signal 11 | # 导入 retry 库以方便进行下载出错重试 12 | from retry import retry 13 | signal.signal(signal.SIGINT, multitasking.killall) 14 | 15 | # 请求头 16 | headers = { 17 | 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE' 18 | } 19 | # 定义 1 MB 多少为 B 20 | MB = 1024**2 21 | 22 | 23 | def split(start: int, end: int, step_1: int) -> list[tuple[int, int]]: 24 | # 分多块 25 | #if step_1 >= 52428800: 26 | # # 如果小于50MB 27 | # step = step_1 28 | #elif step_1 >= 1073741824: 29 | # # 大于1G 减去0.5G 30 | # step = step_1 - 536870912 31 | #else: 32 | # # 如果都不是 自己砍一半 33 | # step = step_1//2 34 | step = step_1 35 | 36 | 37 | parts = [(start, min(start+step, end)) 38 | for start in range(0, end, step)] 39 | return parts 40 | 41 | 42 | def get_file_size(url: str, raise_error: bool = False) -> int: 43 | ''' 44 | 获取文件大小 45 | Parameters 46 | ---------- 47 | url : 文件直链 48 | raise_error : 如果无法获取文件大小,是否引发错误 49 | Return 50 | ------ 51 | 文件大小(B为单位) 52 | 如果不支持则会报错 53 | ''' 54 | response = requests.head(url) 55 | file_size = response.headers.get('Content-Length') 56 | if file_size is None: 57 | if raise_error is True: 58 | raise ValueError('该文件不支持多线程分段下载!') 59 | return file_size 60 | return int(file_size) 61 | 62 | 63 | def download(url: str, file_name: str, retry_times: int = 6, each_size=16*MB) -> None: 64 | ''' 65 | 根据文件直链和文件名下载文件 66 | Parameters 67 | ---------- 68 | url : 文件直链 69 | file_name : 文件名 70 | retry_times: 可选的,每次连接失败重试次数 71 | Return 72 | ------ 73 | None 74 | ''' 75 | f = open(file_name, 'wb') 76 | file_size = get_file_size(url) 77 | file_size_print_2 = file_size/1024 78 | file_size_print = file_size_print_2/1024 79 | print("文件大小" + str(file_size_print) + " MB") 80 | 81 | @retry(tries=retry_times) 82 | @multitasking.task 83 | def start_download(start: int, end: int) -> None: 84 | ''' 85 | 根据文件起止位置下载文件 86 | Parameters 87 | ---------- 88 | start : 开始位置 89 | end : 结束位置 90 | ''' 91 | _headers = headers.copy() 92 | # 分段下载的核心 93 | _headers['Range'] = f'bytes={start}-{end}' 94 | # 发起请求并获取响应(流式) 95 | response = session.get(url, headers=_headers, stream=True) 96 | # 每次读取的流式响应大小 97 | chunk_size = 84992 98 | # 暂存已获取的响应,后续循环写入 99 | chunks = [] 100 | for chunk in response.iter_content(chunk_size=chunk_size): 101 | # 暂存获取的响应 102 | chunks.append(chunk) 103 | # 更新进度条 104 | bar.update(chunk_size) 105 | f.seek(start) 106 | for chunk in chunks: 107 | f.write(chunk) 108 | # 释放已写入的资源 109 | del chunks 110 | 111 | session = requests.Session() 112 | # 分块文件如果比文件大,就取文件大小为分块大小 113 | each_size = min(each_size, file_size) 114 | 115 | # 分块 116 | parts = split(0, file_size, each_size) 117 | print(f'分块数:{len(parts)}') 118 | # 创建进度条 119 | bar = tqdm(total=file_size, desc=f'下载文件:{file_name}') 120 | for part in parts: 121 | start, end = part 122 | start_download(start, end) 123 | # 等待全部线程结束 124 | multitasking.wait_for_tasks() 125 | f.close() 126 | bar.close() 127 | 128 | 129 | if "__main__" == __name__: 130 | url = 'https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/0d/ea/f936c14b6e886221e53354e1992d0c4e0eb9566fcc70201047bb664ce777/tensorflow-2.3.1-cp37-cp37m-macosx_10_9_x86_64.whl#sha256=1f72edee9d2e8861edbb9e082608fd21de7113580b3fdaa4e194b472c2e196d0' 131 | #url = 'https://download.visualstudio.microsoft.com/download/pr/cc04076c-d188-4c20-9b4f-89be06f1a39c/32da746ef46fbeedb4f609b67cb451c3/windowsdesktop-runtime-6.0.6-win-x86.exe' 132 | #url = 'https://visualstudio.microsoft.com/aabf4bb0-b5f4-4e42-8aae-6ad17ec46db2' 133 | #url = 'https://file.skyworldstudio.top/d/SoftwareRelease/MOS/Publish/2.0.4-alpha/2.0.4-alpha-win.zip' 134 | #url = 'https://download.visualstudio.microsoft.com/download/pr/ca7c7580-dd29-42d8-a0b1-3223e61f1623/b38739f51587806a5751419435d6c4ad/visualstudioformacinstaller-17.0.4.5.dmg' 135 | file_name = 'BaiduNetdisk_7.2.8.9.dmg' 136 | # 开始下载文件 137 | download(url, file_name) -------------------------------------------------------------------------------- /Download/4.py: -------------------------------------------------------------------------------- 1 | import math 2 | from concurrent.futures import ProcessPoolExecutor 3 | 4 | import requests 5 | 6 | # 设置超时时间为30s 7 | # socket.setdefaulttimeout(30) 8 | 9 | 10 | def make_file_buff(name, length): 11 | """ 12 | 生成整个文件大小的空文件 13 | :param name: 文件名 14 | :param length: 总字节数 15 | """ 16 | with open(name, 'wb') as f: 17 | f.seek(length - 1) 18 | f.write(b'\x00') 19 | 20 | 21 | def write_part(name, index, part, config): 22 | """ 23 | 写入片 24 | :param name: 文件名 25 | :param index: 第几个片 26 | :param part: 二进制片 27 | :param config: 整体配置 28 | """ 29 | with open(name, 'rb+') as f: 30 | f.seek(index * config['GROUP_PART'] + config['DEFAULT_MIN_PART']) 31 | f.write(part) 32 | 33 | 34 | def down_part(url, name, index, config): 35 | """ 36 | 下载片 37 | :param url: url链接 38 | :param name: 文件名 39 | :param index: 下载第几个片 40 | :param config: 整体配置 41 | :return: 片的索引 42 | """ 43 | while True: 44 | try: 45 | print('片{0}开始下载'.format(index)) 46 | write_part(name, index, requests.get(url, headers={'Range': 'bytes=%d-%d' % ( 47 | index * config['GROUP_PART'] + config['DEFAULT_MIN_PART'], (index + 1) * config['GROUP_PART'] + config['DEFAULT_MIN_PART'])}).content, config) 48 | return index 49 | except Exception as e: 50 | print(e) 51 | 52 | 53 | def main(): 54 | config = { 55 | 56 | # 默认每个片最小2MB 57 | 'DEFAULT_MIN_PART': 2048 * 1024, 58 | 59 | # 每个组分配下载量大小 60 | 'GROUP_PART': 0, 61 | 62 | # 最大进程<=10 63 | 'MAX_THREAD': 10 64 | } 65 | 66 | url = 'https://download.visualstudio.microsoft.com/download/pr/ca7c7580-dd29-42d8-a0b1-3223e61f1623/b38739f51587806a5751419435d6c4ad/visualstudioformacinstaller-17.0.4.5.dmg' 67 | #url = 'https://dbeaver.io/files/dbeaver-ce-latest-x86_64-setup.exe' 68 | # 解析文件名 69 | file_name = url[url.rindex('/') + 1:] 70 | # 默认下载2M的开头 71 | 72 | res = requests.get( 73 | url, headers={'Range': 'bytes=0-%d' % config['DEFAULT_MIN_PART']}) 74 | # 根据返回的头信息解析总长度 75 | content_length = res.headers['Content-Range'] 76 | # 总长度 77 | size = int(content_length[content_length.index('/') + 1:]) 78 | # 创建空白文件 79 | make_file_buff(file_name, size) 80 | with open(file_name, 'rb+') as f: 81 | f.write(res.content) 82 | 83 | # 如果总长度小于最小片,则已经下载完成 84 | if size <= config['DEFAULT_MIN_PART']: 85 | exit(0) 86 | # 以最小片计算所需线程数 87 | workers = math.ceil(size / config['DEFAULT_MIN_PART']) - 1 88 | # 大于10则限定在10以内 89 | if workers >= 10: 90 | config['GROUP_PART'] = math.ceil( 91 | (size - config['DEFAULT_MIN_PART']) / 10) 92 | else: 93 | config['GROUP_PART'] = math.ceil( 94 | (size - config['DEFAULT_MIN_PART']) / config['DEFAULT_MIN_PART']) 95 | 96 | # 最终实际线程数 97 | workers = math.ceil( 98 | (size - config['DEFAULT_MIN_PART']) / config['GROUP_PART']) 99 | 100 | # 最多10个进程同时下载 101 | processPool = ProcessPoolExecutor(max_workers=config['MAX_THREAD']) 102 | 103 | futures = {} 104 | for i in range(0, workers): 105 | # 提交进程下载 106 | job = processPool.submit(down_part, url, file_name, i, config) 107 | futures[job] = i 108 | for job in futures: 109 | re = job.result() 110 | if re != -1: 111 | print('片{0}下载结束'.format(re)) 112 | 113 | 114 | if __name__ == "__main__": 115 | main() 116 | -------------------------------------------------------------------------------- /Download/5.py: -------------------------------------------------------------------------------- 1 | import asyncio 2 | import aiohttp 3 | from tqdm import tqdm 4 | import os 5 | 6 | class bigfile_download: 7 | def __init__(self, session, url, tmp_path='./down_cache', proxy=None, file_fragment_size = 1024 * 1024 * 2): 8 | self.url = url 9 | self.session = session 10 | self.proxy = proxy 11 | self.filename = url.split('/')[-1] 12 | self.mtd_list = [] 13 | self.tmp_path = tmp_path 14 | self.file_fragment_size = file_fragment_size 15 | 16 | self.__mkdir(tmp_path) 17 | 18 | def __mkdir(self, path): 19 | isExists=os.path.exists(path) 20 | if not isExists: 21 | os.makedirs(path) 22 | print(path+' 创建成功') 23 | return True 24 | else: 25 | print(path + ' 目录已存在') 26 | return False 27 | 28 | async def fetch(self, url, method='get', headers = None, retryCount = 3): 29 | r = None 30 | curr_url = url 31 | for i in range(1, retryCount): 32 | if method == 'head': 33 | r = await self.session.head(curr_url, proxy=self.proxy, headers = headers) 34 | else: 35 | r = await self.session.get(curr_url, proxy=self.proxy, headers = headers) 36 | if r.status in (301, 302): 37 | curr_url = r.headers['Location'] 38 | r.close() 39 | else: 40 | return r 41 | return r 42 | 43 | async def get_content_length_from_net(self): 44 | try: 45 | r = await self.fetch(self.url, 'head') 46 | self.filesize = int(r.headers['Content-Length']) 47 | finally: 48 | if r != None: 49 | r.close() 50 | 51 | print("filesize = {0}".format(self.filesize)) 52 | 53 | async def calculation_fragment(self): 54 | filesize = self.filesize 55 | start = 0 56 | end = -1 57 | step = self.file_fragment_size 58 | 59 | file_fragment_n = 1 60 | 61 | while end < filesize - 1: 62 | start = end + 1 63 | end = start + step - 1 64 | total_size = end - start + 1 65 | 66 | if end > filesize: 67 | total_size = end - start 68 | end = filesize 69 | 70 | headers={'Range':'bytes={0}-{1}'.format(start, end)} 71 | self.mtd_list.append((file_fragment_n, start, end, headers, total_size)) 72 | 73 | file_fragment_n = file_fragment_n + 1 74 | 75 | print("file_fragment_num = {0}".format(len(self.mtd_list))) 76 | 77 | async def fragment_down(self, mtd): 78 | target_filename = '{2}/{0}.{1}'.format(self.filename, mtd[0], self.tmp_path) 79 | total_size = mtd[4] 80 | if os.path.exists(target_filename): 81 | target_filename_size = os.path.getsize(target_filename) 82 | if total_size == target_filename_size: 83 | return 84 | else: 85 | os.remove(target_filename) 86 | 87 | pbar = tqdm(desc = 'task{0}'.format(mtd[0]), total=mtd[4], leave=False) 88 | r = None 89 | try: 90 | r = await self.fetch(self.url, headers = mtd[3]) 91 | with open(target_filename, 'wb') as f: 92 | async for chunk, _ in r.content.iter_chunks(): 93 | f.write(chunk) 94 | chunk_size = len(chunk) 95 | pbar.update(chunk_size) 96 | finally: 97 | if r != None: 98 | r.close() 99 | 100 | async def fragment_down_all(self, taskPoolMaxNum): 101 | dltasks = set() 102 | 103 | for mtd in self.mtd_list: 104 | if len(dltasks) >= taskPoolMaxNum: 105 | dones, dltasks = await asyncio.wait(dltasks, return_when=asyncio.FIRST_COMPLETED) 106 | dltasks.add(asyncio.ensure_future(self.fragment_down(mtd))) 107 | dones, dltasks = await asyncio.wait(dltasks) 108 | 109 | async def fragment_merge(self, target_path=None): 110 | if target_path == None: 111 | target_filename = target_path + self.filename 112 | else: 113 | target_filename = self.filename 114 | 115 | with open(target_filename, 'wb') as newfile: 116 | for mtd in self.mtd_list: 117 | target_fragment_filename = '{1}/{0}.{2}'.format(self.filename, self.tmp_path, mtd[0]) 118 | with open(target_fragment_filename, 'rb') as fragment_file: 119 | newfile.write(fragment_file.read()) 120 | print('fragment_merge end!') 121 | 122 | async def fragment_down_check(self): 123 | for mtd in self.mtd_list: 124 | target_filename = '{2}/{0}.{1}'.format(self.filename, mtd[0], self.tmp_path) 125 | total_size = mtd[4] 126 | if os.path.exists(target_filename): 127 | target_filename_size = os.path.getsize(target_filename) 128 | if total_size == target_filename_size: 129 | return True 130 | else: 131 | print('fragment_down_check error1!') 132 | return False 133 | else: 134 | print('fragment_down_check error2!') 135 | return False 136 | 137 | print('fragment_down_check ok!') 138 | return True 139 | 140 | async def download_bigfile(url, proxy=None): 141 | file_fragment_size = 1024 * 1024 * 2 142 | task_num_max = 5 143 | tmp_path = './down_cache' 144 | target_path = './' 145 | 146 | async with aiohttp.ClientSession() as session: 147 | bd = bigfile_download(session, url, tmp_path=tmp_path, proxy=proxy, file_fragment_size = file_fragment_size) 148 | await bd.get_content_length_from_net() 149 | await bd.calculation_fragment() 150 | for i in range(1, 10): 151 | if await bd.fragment_down_check() == True: 152 | await bd.fragment_merge(target_path) 153 | break 154 | await bd.fragment_down_all(task_num_max) 155 | 156 | async def main(): 157 | url = 'https://repo.msys2.org/distrib/x86_64/msys2-x86_64-20210228.exe' 158 | await download_bigfile(url = url) 159 | 160 | if __name__ == '__main__': 161 | loop = asyncio.get_event_loop() 162 | loop.run_until_complete(main()) 163 | -------------------------------------------------------------------------------- /Java_Downloader_.py: -------------------------------------------------------------------------------- 1 | import traceback 2 | 3 | import requests 4 | from Java_Downloader_UI import Ui_Dialog as Ui_Java_Dowmloader 5 | from Java_Downloader_OK import Java_OK_UI as Ui_Java_Dowmloader_OK_ 6 | 7 | from PyQt6.QtWidgets import QApplication, QLabel, QDialogButtonBox, QDialog 8 | from PyQt6.QtCore import QPropertyAnimation, QTimer, QThread, pyqtSignal 9 | from PyQt6 import QtWidgets, QtCore 10 | 11 | 12 | class Java_Downloader__(QDialog, Ui_Java_Dowmloader): 13 | sinOut = pyqtSignal() 14 | 15 | def __init__(self, v=None, url=None, file=None): 16 | super().__init__() 17 | self.v = v 18 | self.url = url 19 | self.file = file 20 | self.setupUi(self) 21 | self.show() 22 | 23 | # 添加阴影 24 | self.effect_shadow = QtWidgets.QGraphicsDropShadowEffect(self) 25 | self.effect_shadow.setOffset(0, 0) # 偏移 26 | self.effect_shadow.setBlurRadius(15) # 阴影半径 27 | self.effect_shadow.setColor(QtCore.Qt.GlobalColor.gray) # 阴影颜色 28 | self.setGraphicsEffect(self.effect_shadow) # 将设置套用到窗口中 29 | 30 | def start_(self): 31 | self.progressBar.setValue(0) 32 | self.pushButton.clicked.connect(self.J_D_stop) 33 | self.progressBar.setValue(0) 34 | self.progressBar_2.setValue(0) 35 | self.progressBar_2.setMaximum(0) 36 | # QApplication.processEvents() 37 | # 启动线程 38 | self.d = Java_d(self.url, self.file) 39 | self.d.sinOut_d_j.connect(self.sinOut_d_j_) # 下载进度 40 | self.d.start() 41 | 42 | def J_D_stop(self): 43 | """暂停&取消下载""" 44 | from MOS_Downloader import Downloader 45 | Downloader.q_() 46 | self.d.terminate() # 强行终止 47 | self.d.wait() 48 | self.clicked_pushButton_close() 49 | 50 | def clicked_pushButton_close(self): 51 | self.pushButton.setEnabled(False) # 为了防止重复操作 直接禁用按钮 52 | self.anim = QPropertyAnimation(self, b"windowOpacity") # 设置动画对象 53 | self.anim.setDuration(300) # 设置动画时长 54 | self.anim.setStartValue(1) # 设置初始属性,1.0为不透明 55 | self.anim.setEndValue(0) # 设置结束属性,0为完全透明 56 | self.anim.finished.connect(self.close_) # 动画结束时,关闭窗口 57 | self.anim.start() # 开始动画 58 | 59 | def sinOut_d_j_(self, j): 60 | """下载线程的状态""" 61 | if j == 'D': 62 | # 这个计时器用来更新 进度+网速 63 | self.j_h = QTimer() # 创建计时器对象 64 | self.j_h.timeout.connect(self.Java_d_j) # 要执行的槽 65 | self.j_h.start(50) # 开始计时器 66 | 67 | elif j == 'P_1': 68 | # 配置第1步 69 | self.j_h.stop() # 停止刷新进度的计时器 70 | self.progressBar.setValue(110) 71 | self.progressBar_2.setMaximum(100) 72 | self.label_5.setText("正在解压……(1/6)") 73 | elif j == 'P_2': 74 | # 配置第2步 75 | self.progressBar_2.setValue(10) 76 | self.label_5.setText("正在解压……(2/6)") 77 | elif j == 'P_3': 78 | # 配置第3步 79 | self.progressBar_2.setValue(35) 80 | self.label_5.setText("正在解压……(3/6)") 81 | elif j == 'P_4': 82 | # 配置第4步 83 | self.progressBar_2.setValue(60) 84 | self.label_5.setText("正在解压……(4/6)") 85 | elif j == 'P_5': 86 | # 配置第5步 87 | self.progressBar_2.setValue(85) 88 | self.label_5.setText("正在解压……(5/6)") 89 | elif j == 'OK': 90 | # 配置OK 91 | self.progressBar_2.setValue(100) 92 | self.label_5.setText("正在解压……(6/6)") 93 | self.sinOut.emit() 94 | self.progressBar.setValue(0) 95 | self.clicked_pushButton_close() 96 | 97 | def Java_d_j(self): 98 | import MOS_Downloader 99 | a = MOS_Dowmloader.j_h() 100 | b = MOS_Dowmloader.w_h() 101 | self.progressBar.setValue(a) 102 | self.label_5.setText(b) 103 | 104 | def close_(self): 105 | self.close() 106 | 107 | 108 | class Java_d(QThread): 109 | sinOut_d_j = pyqtSignal(str) # 进度(下载/配置) 110 | 111 | def __init__(self, url, file): 112 | super(Java_d, self).__init__() 113 | self.url = url 114 | self.file = file 115 | 116 | def run(self): 117 | from MOS_Downloader import Downloader 118 | from multiprocessing import Process 119 | try: 120 | a = Downloader(self.url, 100, self.file) 121 | except requests.exceptions.MissingSchema: 122 | pass 123 | self.sinOut_d_j.emit("D") # 告诉槽 已经开始下载 124 | a.run() 125 | self.sinOut_d_j.emit("P_1") # 开始配置 126 | 127 | import os 128 | f_name = self.file.replace(".gz", "") 129 | # 获取文件的名称,去掉 130 | import gzip 131 | g_file = gzip.GzipFile(self.file) 132 | 133 | self.sinOut_d_j.emit("P_2") # 配置02 134 | 135 | open(f_name, "w+").write(str(g_file.read())) # 创建gzip对象 136 | # gzip对象用read()打开后,写入open()建立的文件里。 137 | g_file.close() 138 | # 关闭gzip对象 139 | 140 | self.sinOut_d_j.emit("P_3") # 配置03 141 | 142 | import tarfile 143 | tar = tarfile.open(self.file) 144 | names = tar.getnames() 145 | self.sinOut_d_j.emit("P_4") # 配置04 146 | a = str(self.file).split('.tar.gz') 147 | a_1 = a[0] 148 | self.file = a_1 149 | 150 | import shutil 151 | if os.path.exists(self.file): 152 | shutil.rmtree(self.file) 153 | else: 154 | pass 155 | 156 | if os.path.isdir(self.file): 157 | pass 158 | else: 159 | os.mkdir(self.file) 160 | self.sinOut_d_j.emit("P_5") # 配置05 161 | # 因为解压后是很多文件,预先建立同名目录 162 | for name in names: 163 | tar.extract(name, self.file) 164 | tar.close() 165 | 166 | from MOS_UI_Main import file_h 167 | 168 | file_2 = os.path.join(file_h(), '.MOS', 'Java') 169 | 170 | if os.path.exists(file_2): 171 | shutil.rmtree(file_2) 172 | else: 173 | shutil.move(self.file, file_2) 174 | 175 | self.sinOut_d_j.emit("OK") # OK 176 | -------------------------------------------------------------------------------- /Java_Downloader_OK.py: -------------------------------------------------------------------------------- 1 | from Java_Downloader_OK_UI import Ui_Dialog_2 as Java_Dowmloader_OK_UI 2 | from PyQt6 import QtWidgets, QtCore 3 | from PyQt6.QtWidgets import QDialog 4 | from PyQt6.QtCore import QPropertyAnimation, pyqtSignal 5 | 6 | 7 | class Java_OK_UI(QDialog,Java_Dowmloader_OK_UI): 8 | sinOut = pyqtSignal() 9 | 10 | def __init__(self): 11 | super(Java_OK_UI, self).__init__() 12 | self.setupUi(self) 13 | self.show() 14 | self.pushButton.clicked.connect(self.clicked_pushButton_close) 15 | 16 | # 添加阴影 17 | self.effect_shadow = QtWidgets.QGraphicsDropShadowEffect(self) 18 | self.effect_shadow.setOffset(0, 0) # 偏移 19 | self.effect_shadow.setBlurRadius(155) # 阴影半径 20 | self.effect_shadow.setColor(QtCore.Qt.GlobalColor.gray) # 阴影颜色 21 | self.setGraphicsEffect(self.effect_shadow) # 将设置套用到窗口中 22 | 23 | def clicked_pushButton_close(self): 24 | self.pushButton.setEnabled(False) # 为了防止重复操作 直接禁用按钮 25 | self.anim = QPropertyAnimation(self, b"windowOpacity") # 设置动画对象 26 | self.anim.setDuration(300) # 设置动画时长 27 | self.anim.setStartValue(1) # 设置初始属性,1.0为不透明 28 | self.anim.setEndValue(0) # 设置结束属性,0为完全透明 29 | self.anim.finished.connect(self.close_) # 动画结束时,关闭窗口 30 | self.anim.start() # 开始动画 31 | 32 | def close_(self): 33 | self.sinOut.emit() 34 | self.close() 35 | -------------------------------------------------------------------------------- /Java_Downloader_OK_UI.py: -------------------------------------------------------------------------------- 1 | # Form implementation generated from reading ui file '/Users/xyj/.npm/ssh/UI/UI/Java_Dowmloader_OK_UI.ui' 2 | # 3 | # Created by: PyQt6 UI code generator 6.3.1 4 | # 5 | # WARNING: Any manual changes made to this file will be lost when pyuic6 is 6 | # run again. Do not edit this file unless you know what you are doing. 7 | 8 | 9 | from PyQt6 import QtCore, QtGui, QtWidgets 10 | 11 | 12 | class Ui_Dialog_2(object): 13 | def setupUi(self, Dialog_2): 14 | Dialog_2.setObjectName("Dialog_2") 15 | Dialog_2.resize(505, 120) 16 | Dialog_2.setMinimumSize(QtCore.QSize(505, 120)) 17 | Dialog_2.setMaximumSize(QtCore.QSize(505, 120)) 18 | Dialog_2.setStyleSheet("QDialog{background-color: rgb(255, 255, 255);}\n" 19 | "#pushButton{border:2px solid rgba(235, 235, 235,0);height:25px;border-radius:5px;}\n" 20 | "#pushButton::hover{background-color: rgb(192, 192, 192);}\n" 21 | "#pushButton::pressed{background-color: rgb(169, 169, 169);}\n" 22 | "\n" 23 | "#pushButton_2{background-color: rgba(255, 255, 255, 0);}") 24 | self.gridLayout = QtWidgets.QGridLayout(Dialog_2) 25 | self.gridLayout.setObjectName("gridLayout") 26 | self.pushButton = QtWidgets.QPushButton(Dialog_2) 27 | self.pushButton.setMinimumSize(QtCore.QSize(200, 30)) 28 | self.pushButton.setMaximumSize(QtCore.QSize(200, 30)) 29 | self.pushButton.setStyleSheet("font-size: 14px;") 30 | self.pushButton.setObjectName("pushButton") 31 | self.gridLayout.addWidget(self.pushButton, 2, 3, 1, 1) 32 | self.label_2 = QtWidgets.QLabel(Dialog_2) 33 | self.label_2.setStyleSheet("font-size: 16px;") 34 | self.label_2.setIndent(2) 35 | self.label_2.setObjectName("label_2") 36 | self.gridLayout.addWidget(self.label_2, 0, 2, 1, 2) 37 | self.label = QtWidgets.QLabel(Dialog_2) 38 | self.label.setStyleSheet("font-size: 14px;") 39 | self.label.setObjectName("label") 40 | self.gridLayout.addWidget(self.label, 1, 2, 1, 2) 41 | spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) 42 | self.gridLayout.addItem(spacerItem, 2, 1, 1, 2) 43 | self.pushButton_2 = QtWidgets.QPushButton(Dialog_2) 44 | self.pushButton_2.setMinimumSize(QtCore.QSize(50, 50)) 45 | self.pushButton_2.setMaximumSize(QtCore.QSize(50, 50)) 46 | self.pushButton_2.setText("") 47 | icon = QtGui.QIcon() 48 | icon.addPixmap(QtGui.QPixmap(":/ing/OK.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) 49 | self.pushButton_2.setIcon(icon) 50 | self.pushButton_2.setIconSize(QtCore.QSize(40, 40)) 51 | self.pushButton_2.setObjectName("pushButton_2") 52 | self.gridLayout.addWidget(self.pushButton_2, 0, 1, 2, 1) 53 | 54 | self.retranslateUi(Dialog_2) 55 | QtCore.QMetaObject.connectSlotsByName(Dialog_2) 56 | 57 | def retranslateUi(self, Dialog_2): 58 | _translate = QtCore.QCoreApplication.translate 59 | Dialog_2.setWindowTitle(_translate("Dialog_2", "Dialog")) 60 | self.pushButton.setText(_translate("Dialog_2", "好的")) 61 | self.label_2.setText(_translate("Dialog_2", "提示")) 62 | self.label.setText(_translate("Dialog_2", "下载&配置Java完成")) 63 | -------------------------------------------------------------------------------- /Java_Downloader_OK_UI_rc.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Resource object code 4 | # 5 | # Created by: The Resource Compiler for PyQt5 (Qt v5.15.2) 6 | # 7 | # WARNING! All changes made in this file will be lost! 8 | 9 | from PyQt6 import QtCore 10 | 11 | qt_resource_data = b"\ 12 | \x00\x00\x06\x86\ 13 | \x89\ 14 | \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ 15 | \x00\x00\x60\x00\x00\x00\x60\x08\x06\x00\x00\x00\xe2\x98\x77\x38\ 16 | \x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\ 17 | \x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\x00\x00\x06\ 18 | \x30\x49\x44\x41\x54\x78\x9c\xed\x9d\xcd\x72\xd3\x30\x10\xc7\x77\ 19 | \x9d\x67\xa0\x0c\x50\x06\x3f\x40\x93\xc9\x95\x4e\x66\x30\x6f\x91\ 20 | \xf6\x54\x9e\xa4\xc9\x93\x94\x5e\x68\xde\xa2\xce\x4c\x09\xd7\x92\ 21 | \xe4\x4e\x3f\x38\xb4\xbc\x43\x2d\x0e\x8e\x88\x9b\xa6\xd6\x4a\x5a\ 22 | \x59\x72\xd1\xef\x46\x71\x6c\x79\xff\xde\x95\xb4\xb2\xd6\x00\x91\ 23 | \x48\x24\x12\x89\x44\x22\x91\x48\xe4\x7f\x03\x7d\x37\x40\x45\x7f\ 24 | \x30\xcc\x00\x00\x8a\x22\xc9\x00\x00\x84\x10\x9f\xe4\xff\x21\xc2\ 25 | \xea\x6f\x90\x97\xff\xc6\x69\xf5\xb7\x49\x52\xe4\x97\x17\x93\xbc\ 26 | \x89\x76\x9a\x12\x9c\x00\xd2\xe0\x0f\x0f\x78\x2c\x0d\x6c\x0f\x8e\ 27 | \x01\x00\xe6\xb3\x6f\x23\x9e\xf3\xf1\x11\x84\x00\xfd\xc1\x30\x2b\ 28 | \x8a\x24\x13\x42\x7c\xe2\x33\xfa\x76\x84\x80\x1c\x11\xa7\xa1\x78\ 29 | \x87\x57\x01\xfa\x83\x61\xc6\xfb\xa4\x9b\x80\x63\x9f\x9e\xe1\x45\ 30 | \x80\x30\x0c\x5f\xc5\x5f\x88\x6a\x54\x80\xf0\x0c\xbf\x09\x8e\x9b\ 31 | \x0e\x4d\x8d\x08\x10\xbe\xe1\x37\x69\x2e\x2c\x39\x17\xa0\xec\x60\ 32 | \xf1\xdc\xf5\x75\x5c\x90\x24\xe2\xb3\x6b\x6f\x70\x2a\x40\x6f\xff\ 33 | \x70\x04\x20\x8e\x6d\xcf\x23\x47\x2e\x00\xe5\xd8\x5e\xfe\x5d\x1a\ 34 | \x67\x73\xae\x50\xf9\xa5\xf5\xb5\x5d\x7b\x83\x33\x01\x6c\x8d\x2f\ 35 | \x04\xe4\x9d\x8e\x18\xdb\x3e\x81\x65\x3b\x00\xec\xc4\x70\x27\x82\ 36 | \x13\x01\xba\x1f\x0f\xce\x4d\xe2\x3d\x97\xd1\x9f\x43\xce\x37\xcc\ 37 | \xc4\x70\x23\x02\xab\x00\xa6\x9d\xad\x6b\xc3\x6f\xc3\xc4\x43\x5d\ 38 | \xb4\xb3\xc3\x75\x22\x00\x80\x57\xef\xba\x27\x3a\xc6\x5f\xdd\xd0\ 39 | \x97\xf9\x6c\x32\xbe\xbb\x59\x5e\x71\xb6\x45\xc5\xfd\xed\x22\x7f\ 40 | \xf3\x61\x6f\x2a\x44\x72\x0d\x40\x6b\x33\x22\xa4\x45\x81\xe9\x9f\ 41 | \xdf\xcb\x53\xae\x76\xb0\x79\x80\xee\x13\xd5\xc4\x08\x83\x8a\x6e\ 42 | \xdb\x85\x80\x7c\xf1\xe3\xec\x33\xc7\xb5\x59\x04\xd0\xb9\x01\xce\ 43 | \xc6\x73\xa3\xd7\x77\xf1\xf4\x09\xd6\x21\x48\xef\xe9\xc1\xf1\xe2\ 44 | \xc7\xd9\x17\xdb\x6b\xba\xe2\xcf\xef\xe5\xe9\xeb\xf7\x3d\x04\x5a\ 45 | \x48\xca\x5e\xbf\xef\xe1\xfd\xed\x22\xb7\xb9\xa6\x95\x00\xfd\xc1\ 46 | \x30\x13\x02\x4e\x68\x47\xfb\x4d\x7a\x51\xb9\xbf\x5d\xe4\x3a\x22\ 47 | \xbc\xf9\xb0\x37\xb5\xe9\xbf\xac\x04\xd8\xd9\xed\xfe\xa2\x1d\xd9\ 48 | \x0e\xe3\x4b\x74\x44\x10\x02\x8f\x6c\x44\x48\x4c\x7e\x04\x50\x9d\ 49 | \xe0\xa8\x68\x97\xf1\x25\x65\x9b\xcb\x2c\xa9\x8a\x87\x07\x34\x9e\ 50 | \xe4\x19\x79\x00\x3d\xf4\xb4\xd3\xf8\x12\xaa\x27\x20\x42\x6a\xea\ 51 | \x05\x46\x1e\xf0\x34\xe7\xf2\x14\x21\x20\x6f\xb3\xf1\x25\xf3\xd9\ 52 | \xb7\x91\x5c\x73\xae\xc3\xd4\x0b\xb4\x87\xa1\xd4\x51\xcf\x7c\x76\ 53 | \x16\xc4\x72\x27\x17\xbd\xfd\x03\xa1\x3a\xc6\x64\x6e\x63\xdc\x07\ 54 | \xd4\x43\x8b\x9d\x21\xa1\xea\xd3\x92\x44\x28\xe7\x2e\x26\x5e\xa0\ 55 | \xd5\x07\xd0\x9e\xfe\xf6\xc5\xfd\xd5\x04\xec\xa8\x6e\x5c\x7f\x77\ 56 | \xb3\xbc\xda\xd9\xed\x66\x88\x90\x3e\x77\x1e\x93\xbe\x40\xd3\x03\ 57 | \xd4\xa1\xa7\x9a\xaf\x6f\x03\x8f\x67\xbf\xe2\xb8\xce\x13\x3a\x1d\ 58 | \xa1\xf4\x6c\x5d\x2f\x20\x0b\x20\x17\x3d\xea\xc1\x46\x33\x9a\xb6\ 59 | \x6c\x4f\x3d\x3c\x2f\xc2\xe5\xc5\x24\x57\x75\xc8\x88\x90\xd1\x6c\ 60 | \x55\x42\x16\x80\x32\xf2\x69\x53\xe8\xa9\xcf\xfb\x3c\x2f\x02\xc5\ 61 | \x0b\x28\xb6\x92\x90\x05\xa8\xbe\x12\xb8\x9d\xf6\x74\xbc\xb4\xa4\ 62 | \xdb\x76\x11\x28\x5e\xa0\xb6\xd5\x1a\xb2\x00\xaa\x06\xb7\x25\xf6\ 63 | \x9b\xae\xd6\x55\x51\x79\x81\x4e\x18\x22\x09\x40\x49\x3b\xb4\x21\ 64 | \xf6\x73\xa5\x9b\x39\xef\x95\x69\x1e\x10\x7e\xf8\xe1\xce\xf5\xab\ 65 | \xc2\x10\x75\x34\x44\x14\x80\xe3\xf5\x0e\x7f\xb8\x58\x68\xa1\x84\ 66 | \x21\xd2\xd5\x54\x07\x50\x5e\xac\x0a\x39\xed\xe0\x72\x95\x4b\x95\ 67 | \x9e\xa0\xa4\x26\x94\x1e\xa0\x1e\x52\x85\x1b\x7e\x5c\x2f\x31\x52\ 68 | \x92\x74\x2a\x1c\xe5\x82\xfc\xd3\xc4\xfa\xee\xe6\x8e\x9c\x4d\x28\ 69 | \xf3\x81\x17\x29\x80\x8f\xc5\x75\x53\x5e\x9c\x00\x4d\x1a\x5f\x35\ 70 | \xf7\xa1\x4c\xc8\x94\x02\xa8\x4e\x12\xd2\x04\xac\x4d\x4f\xbe\xc4\ 71 | \x8b\x07\xe8\x24\xab\xa8\xb4\xd1\xf8\x00\x04\x01\x54\x37\xa5\x3b\ 72 | \x2b\xec\xed\x1f\x8e\x8a\x02\xcf\xbb\x1f\x0f\xd8\xf6\x0c\xf8\x32\ 73 | \xbe\xea\xde\x29\x6d\x6a\xd4\x03\xaa\x0b\x3a\x88\x90\x71\x88\xd0\ 74 | \xd6\x27\x5f\x42\xe8\x03\xea\xc7\xba\xd4\x70\xb2\x6d\x35\xcd\x56\ 75 | \x04\xdf\xc6\x57\xdd\x3b\x65\x9e\xd0\x88\x07\xd4\x2d\x65\x9a\x8a\ 76 | \xe0\xdb\xf8\x5c\x38\x17\x80\xb2\x8e\xac\x2b\x42\x28\xc6\x57\x4d\ 77 | \xb4\x54\x13\x35\x00\x52\x27\x6c\x3f\xdb\xa3\x40\x15\x21\x14\xe3\ 78 | \x73\xe1\xdc\x03\x74\x5e\xf1\x53\x89\xf0\xd2\x8c\x0f\x40\x10\x80\ 79 | \x63\xb6\xc7\x21\xc2\x4b\x34\x3e\x00\x83\x07\x50\x8d\x62\x23\x42\ 80 | \xb8\xc6\xaf\xef\xdb\x28\x59\x02\x52\x1e\x9f\x23\xef\xbd\x3e\x97\ 81 | \xde\x6e\x1a\x00\xba\xc8\x4d\x1a\x9f\x72\x1f\x94\x75\x12\x92\x07\ 82 | \x70\x2d\xbf\x01\xe8\x7b\x42\x88\xc6\xa7\x41\xbb\x47\x92\x00\x5c\ 83 | \xcb\x6f\x12\x1d\x11\x68\xf8\x30\x3e\xcf\x32\x2d\xdb\x28\x48\x37\ 84 | \xc1\xc6\x27\x42\xf3\xc6\xa7\xdc\x2b\xb5\x4d\x24\x01\x28\x2f\x23\ 85 | \x99\xbc\x19\x6c\x2f\x82\x9f\xb0\xa3\x9a\xfb\xe8\x2c\x55\x6a\xbc\ 86 | \x98\x55\x3f\x21\xd3\x7d\x27\x52\x62\x2e\x82\xcf\x98\xaf\x9a\xd9\ 87 | \xab\x67\xc0\x12\xb2\x00\x94\x21\x95\xe9\x2e\x11\x7d\x11\xfc\x19\ 88 | \x9f\xf2\x92\x9a\xce\x22\x15\x79\x7f\x80\xab\xf7\xe3\x25\xf4\x9d\ 89 | \x89\xfe\x8c\x4f\xdd\x1b\xf7\xf3\xfb\x84\xbc\x17\x5a\xab\x13\x76\ 90 | \xf1\x7e\x7c\x15\xb5\x27\xf8\x1d\x6a\xd2\xf2\x5e\x7a\xe1\x54\x6b\ 91 | \x87\x8c\x6b\x2f\x00\xa8\xf3\x04\xbf\xc6\x77\xb5\x3b\x48\x7b\x18\ 92 | \x4a\x7b\x3f\xde\xae\x44\xd9\x53\x4f\x08\x61\x92\xe5\xe6\xf5\x4c\ 93 | \xed\x7d\xc2\x14\x2f\x00\x00\xd8\xd9\xed\x66\x36\x65\x5d\xd6\x9e\ 94 | \x80\x53\xdf\xc6\x5f\xe5\xa2\xd2\xfa\xa3\xcc\x1e\x12\xa3\x8d\xda\ 95 | \x6f\xd3\xbd\x6b\x21\xf0\xa8\xb6\x39\x08\xa9\x6d\x31\x8b\xfb\xdb\ 96 | \x45\x6e\x5b\x0c\xc3\x96\xde\xfe\xe1\x08\x11\x8e\x54\xc7\x25\x89\ 97 | \x30\xaa\x79\x64\x24\x00\xd5\x0b\x80\xa9\xa2\x88\x2f\xe8\x89\x43\ 98 | \x1c\xff\xfc\x7e\xf6\xd5\xe4\x1a\xc6\xc5\x3a\x28\x5e\xb0\xa2\x95\ 99 | \x22\xe8\x64\x6d\xe7\x33\xf3\xfa\x47\xc6\xb9\xa0\xcb\x8b\x49\x4e\ 100 | \xd9\xbc\x5c\x52\xbf\xfd\x33\x34\x74\x8c\x4f\xb7\xc1\x76\xac\xca\ 101 | \xd5\xdc\xdd\x2c\xaf\x9a\x2e\x70\xe4\x1a\xdd\x02\x54\xa6\xa1\x47\ 102 | \x62\x5d\x31\x4b\xb7\xc0\x91\xed\xe8\xc8\x25\x72\xc7\x3c\xed\x68\ 103 | \x9e\xa1\x31\xdb\xce\x16\xfd\xdd\x87\x21\x8c\xed\x4b\xf4\xcb\x2b\ 104 | \xf3\xb5\x9d\x75\x6b\x91\x89\x08\x3e\x3f\xa4\x60\x52\xe7\x94\xbb\ 105 | \xe8\x20\x6b\xdd\xd0\xb7\xe9\xde\x75\x51\x60\x4a\x18\x9e\x4a\x32\ 106 | \x21\xb0\xb6\x48\x86\x0b\xfa\x83\x61\xf6\xea\x5d\xf7\x04\x00\x47\ 107 | \x1a\x6d\xfd\x57\xb8\x95\xb3\xc6\xa9\x93\xcd\x75\xe6\x75\xa3\xdd\ 108 | \x7a\x84\x4d\x19\x7d\x57\xe5\x36\x83\x2d\xde\xcd\xf5\x55\x0b\x9e\ 109 | \x6f\x17\xb4\xac\x78\xb7\x84\xab\x7c\xfd\x66\x8a\x57\x2e\x78\x6c\ 110 | \x96\xaf\x07\x78\xfc\xb9\x2b\x9e\x0f\x46\xb4\xb4\x7c\xbd\x24\x7e\ 111 | \xc0\xa1\x9e\xc6\x36\x58\xf3\x79\x83\x7b\x9a\xac\xe6\xde\xf8\x47\ 112 | \x7c\xcc\xeb\xf7\xbb\xc7\x47\x19\x7d\x2f\x25\x06\x78\xbe\x6a\xc1\ 113 | \x87\x0f\xc3\x4b\xbc\xd6\x78\xf0\x1d\x96\x7c\x1a\x5e\x12\x44\x91\ 114 | \x8d\xf8\x29\xc3\xc0\xe0\x0e\x51\xf2\x49\x07\x08\xaf\xb0\x54\x90\ 115 | \x02\x54\x59\x77\xdc\x6b\xe4\xa6\x90\xcd\xcf\xd9\x96\x7f\x7b\xfc\ 116 | \xb9\xab\xd0\x0c\x1e\x89\x44\x22\x91\x48\x24\x12\x89\x44\x22\x7f\ 117 | \x01\x76\x2e\x27\x47\x4e\xc9\xfd\x96\x00\x00\x00\x00\x49\x45\x4e\ 118 | \x44\xae\x42\x60\x82\ 119 | " 120 | 121 | qt_resource_name = b"\ 122 | \x00\x03\ 123 | \x00\x00\x70\x47\ 124 | \x00\x69\ 125 | \x00\x6e\x00\x67\ 126 | \x00\x06\ 127 | \x05\x3e\x57\x47\ 128 | \x00\x4f\ 129 | \x00\x4b\x00\x2e\x00\x70\x00\x6e\x00\x67\ 130 | " 131 | 132 | qt_resource_struct_v1 = b"\ 133 | \x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\ 134 | \x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\ 135 | \x00\x00\x00\x0c\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ 136 | " 137 | 138 | qt_resource_struct_v2 = b"\ 139 | \x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\ 140 | \x00\x00\x00\x00\x00\x00\x00\x00\ 141 | \x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\ 142 | \x00\x00\x00\x00\x00\x00\x00\x00\ 143 | \x00\x00\x00\x0c\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ 144 | \x00\x00\x01\x82\x63\x03\x7e\xb0\ 145 | " 146 | 147 | qt_version = [int(v) for v in QtCore.qVersion().split('.')] 148 | if qt_version < [5, 8, 0]: 149 | rcc_version = 1 150 | qt_resource_struct = qt_resource_struct_v1 151 | else: 152 | rcc_version = 2 153 | qt_resource_struct = qt_resource_struct_v2 154 | 155 | def qInitResources(): 156 | QtCore.qRegisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data) 157 | 158 | def qCleanupResources(): 159 | QtCore.qUnregisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data) 160 | 161 | qInitResources() 162 | -------------------------------------------------------------------------------- /Java_Downloader_UI.py: -------------------------------------------------------------------------------- 1 | # Form implementation generated from reading ui file '/Users/xyj/.npm/ssh/UI/UI/Java_Dowmloader_UI.ui' 2 | # 3 | # Created by: PyQt6 UI code generator 6.3.1 4 | # 5 | # WARNING: Any manual changes made to this file will be lost when pyuic6 is 6 | # run again. Do not edit this file unless you know what you are doing. 7 | 8 | 9 | from PyQt6 import QtCore, QtGui, QtWidgets 10 | import Java_Downloader_OK_UI_rc 11 | 12 | class Ui_Dialog(object): 13 | def setupUi(self, Dialog): 14 | Dialog.setObjectName("Dialog") 15 | Dialog.resize(568, 255) 16 | Dialog.setMinimumSize(QtCore.QSize(568, 255)) 17 | Dialog.setMaximumSize(QtCore.QSize(568, 255)) 18 | Dialog.setStyleSheet("background-color: rgb(255, 255, 255);") 19 | self.verticalLayout = QtWidgets.QVBoxLayout(Dialog) 20 | self.verticalLayout.setObjectName("verticalLayout") 21 | self.label = QtWidgets.QLabel(Dialog) 22 | self.label.setObjectName("label") 23 | self.verticalLayout.addWidget(self.label) 24 | self.scrollArea = QtWidgets.QScrollArea(Dialog) 25 | self.scrollArea.setStyleSheet("QScrollArea{border-style:none;}\n" 26 | "QPushButton{border:2px solid rgba(235, 235, 235,0);height:25px;border-radius:5px;}\n" 27 | "QPushButton::hover{background-color: rgb(192, 192, 192);}\n" 28 | "QPushButton::pressed{background-color: rgb(169, 169, 169);}\n" 29 | "\n" 30 | "QProgressBar{\n" 31 | " text-align: center;border-style:none;border-radius:5px;background-color: rgb(235, 235, 235);height:3px;color: rgb(66, 66, 66);\n" 32 | "}\n" 33 | "QProgressBar::chunk{\n" 34 | " border-radius:5px;\n" 35 | " background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(64, 183, 255, 255), stop:1 rgba(67, 146, 255, 255));\n" 36 | "}") 37 | self.scrollArea.setWidgetResizable(True) 38 | self.scrollArea.setObjectName("scrollArea") 39 | self.scrollAreaWidgetContents = QtWidgets.QWidget() 40 | self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 544, 207)) 41 | self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents") 42 | self.gridLayout = QtWidgets.QGridLayout(self.scrollAreaWidgetContents) 43 | self.gridLayout.setObjectName("gridLayout") 44 | self.label_2 = QtWidgets.QLabel(self.scrollAreaWidgetContents) 45 | self.label_2.setObjectName("label_2") 46 | self.gridLayout.addWidget(self.label_2, 0, 0, 1, 1) 47 | self.label_3 = QtWidgets.QLabel(self.scrollAreaWidgetContents) 48 | self.label_3.setObjectName("label_3") 49 | self.gridLayout.addWidget(self.label_3, 2, 0, 1, 1) 50 | spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding) 51 | self.gridLayout.addItem(spacerItem, 4, 0, 1, 2) 52 | self.label_5 = QtWidgets.QLabel(self.scrollAreaWidgetContents) 53 | self.label_5.setObjectName("label_5") 54 | self.gridLayout.addWidget(self.label_5, 5, 0, 1, 1) 55 | self.pushButton = QtWidgets.QPushButton(self.scrollAreaWidgetContents) 56 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Fixed) 57 | sizePolicy.setHorizontalStretch(0) 58 | sizePolicy.setVerticalStretch(0) 59 | sizePolicy.setHeightForWidth(self.pushButton.sizePolicy().hasHeightForWidth()) 60 | self.pushButton.setSizePolicy(sizePolicy) 61 | self.pushButton.setMinimumSize(QtCore.QSize(150, 30)) 62 | self.pushButton.setMaximumSize(QtCore.QSize(150, 30)) 63 | self.pushButton.setObjectName("pushButton") 64 | self.gridLayout.addWidget(self.pushButton, 5, 1, 1, 1) 65 | self.progressBar = QtWidgets.QProgressBar(self.scrollAreaWidgetContents) 66 | self.progressBar.setMinimum(0) 67 | self.progressBar.setMaximum(110) 68 | self.progressBar.setProperty("value", 50) 69 | self.progressBar.setTextVisible(False) 70 | self.progressBar.setObjectName("progressBar") 71 | self.gridLayout.addWidget(self.progressBar, 1, 0, 1, 2) 72 | self.progressBar_2 = QtWidgets.QProgressBar(self.scrollAreaWidgetContents) 73 | self.progressBar_2.setProperty("value", 5) 74 | self.progressBar_2.setTextVisible(False) 75 | self.progressBar_2.setInvertedAppearance(False) 76 | self.progressBar_2.setObjectName("progressBar_2") 77 | self.gridLayout.addWidget(self.progressBar_2, 3, 0, 1, 2) 78 | self.scrollArea.setWidget(self.scrollAreaWidgetContents) 79 | self.verticalLayout.addWidget(self.scrollArea) 80 | 81 | self.retranslateUi(Dialog) 82 | QtCore.QMetaObject.connectSlotsByName(Dialog) 83 | 84 | def retranslateUi(self, Dialog): 85 | _translate = QtCore.QCoreApplication.translate 86 | Dialog.setWindowTitle(_translate("Dialog", "Dialog")) 87 | self.label.setText(_translate("Dialog", "正在下载Java")) 88 | self.label_2.setText(_translate("Dialog", "下载Java")) 89 | self.label_3.setText(_translate("Dialog", "配置Java")) 90 | self.label_5.setText(_translate("Dialog", "0 MB/S - 正在准备下载")) 91 | self.pushButton.setText(_translate("Dialog", "取消")) 92 | -------------------------------------------------------------------------------- /MC_Dowmloader_OK.py: -------------------------------------------------------------------------------- 1 | from MC_Dowmloader_OK_UI import Ui_Dialog as MC_Dowmloader_OK_UI_ 2 | from PyQt6 import QtWidgets, QtCore 3 | from PyQt6.QtWidgets import QDialog 4 | from PyQt6.QtCore import QPropertyAnimation, pyqtSignal 5 | 6 | 7 | class MC_D_OK(QDialog,MC_Dowmloader_OK_UI_): 8 | sinOut = pyqtSignal() 9 | def __init__(self): 10 | super(MC_D_OK, self).__init__() 11 | self.setupUi(self) 12 | self.show() 13 | self.pushButton.clicked.connect(self.clicked_pushButton_close) 14 | 15 | # 添加阴影 16 | self.effect_shadow = QtWidgets.QGraphicsDropShadowEffect(self) 17 | self.effect_shadow.setOffset(0,0) # 偏移 18 | self.effect_shadow.setBlurRadius(155) # 阴影半径 19 | self.effect_shadow.setColor(QtCore.Qt.GlobalColor.gray) # 阴影颜色 20 | self.setGraphicsEffect(self.effect_shadow) # 将设置套用到窗口中 21 | 22 | def clicked_pushButton_close(self): 23 | self.pushButton.setEnabled(False) #为了防止重复操作 直接禁用按钮 24 | self.anim = QPropertyAnimation(self, b"windowOpacity") # 设置动画对象 25 | self.anim.setDuration(300) # 设置动画时长 26 | self.anim.setStartValue(1) # 设置初始属性,1.0为不透明 27 | self.anim.setEndValue(0) # 设置结束属性,0为完全透明 28 | self.anim.finished.connect(self.close_) # 动画结束时,关闭窗口 29 | self.anim.start() # 开始动画 30 | 31 | 32 | def close_(self): 33 | self.sinOut.emit() 34 | self.close() -------------------------------------------------------------------------------- /MC_Dowmloader_OK_UI.py: -------------------------------------------------------------------------------- 1 | # Form implementation generated from reading ui file '/Users/xyj/.npm/ssh/UI/UI/MC_Dowmloader_OK_UI.ui' 2 | # 3 | # Created by: PyQt6 UI code generator 6.3.1 4 | # 5 | # WARNING: Any manual changes made to this file will be lost when pyuic6 is 6 | # run again. Do not edit this file unless you know what you are doing. 7 | 8 | 9 | from PyQt6 import QtCore, QtGui, QtWidgets 10 | import MOS_rc 11 | 12 | class Ui_Dialog(object): 13 | def setupUi(self, Dialog): 14 | Dialog.setObjectName("Dialog") 15 | Dialog.resize(505, 120) 16 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Preferred, QtWidgets.QSizePolicy.Policy.Preferred) 17 | sizePolicy.setHorizontalStretch(0) 18 | sizePolicy.setVerticalStretch(120) 19 | sizePolicy.setHeightForWidth(Dialog.sizePolicy().hasHeightForWidth()) 20 | Dialog.setSizePolicy(sizePolicy) 21 | Dialog.setMinimumSize(QtCore.QSize(505, 120)) 22 | Dialog.setMaximumSize(QtCore.QSize(505, 120)) 23 | Dialog.setStyleSheet("QDialog{background-color: rgb(255, 255, 255);}\n" 24 | "#pushButton{border:2px solid rgba(235, 235, 235,0);height:25px;border-radius:5px;}\n" 25 | "#pushButton::hover{background-color: rgb(192, 192, 192);}\n" 26 | "#pushButton::pressed{background-color: rgb(169, 169, 169);}\n" 27 | "\n" 28 | "#pushButton_2{background-color: rgba(255, 255, 255, 0);}") 29 | self.gridLayout = QtWidgets.QGridLayout(Dialog) 30 | self.gridLayout.setObjectName("gridLayout") 31 | self.pushButton = QtWidgets.QPushButton(Dialog) 32 | self.pushButton.setMinimumSize(QtCore.QSize(200, 30)) 33 | self.pushButton.setMaximumSize(QtCore.QSize(200, 30)) 34 | self.pushButton.setStyleSheet("font-size: 14px;") 35 | self.pushButton.setObjectName("pushButton") 36 | self.gridLayout.addWidget(self.pushButton, 2, 3, 1, 1) 37 | self.pushButton_2 = QtWidgets.QPushButton(Dialog) 38 | self.pushButton_2.setMinimumSize(QtCore.QSize(50, 50)) 39 | self.pushButton_2.setMaximumSize(QtCore.QSize(50, 50)) 40 | self.pushButton_2.setText("") 41 | icon = QtGui.QIcon() 42 | icon.addPixmap(QtGui.QPixmap(":/ing/OK.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) 43 | self.pushButton_2.setIcon(icon) 44 | self.pushButton_2.setIconSize(QtCore.QSize(40, 40)) 45 | self.pushButton_2.setObjectName("pushButton_2") 46 | self.gridLayout.addWidget(self.pushButton_2, 0, 0, 2, 1) 47 | self.label = QtWidgets.QLabel(Dialog) 48 | self.label.setStyleSheet("font-size: 14px;") 49 | self.label.setObjectName("label") 50 | self.gridLayout.addWidget(self.label, 1, 1, 1, 3) 51 | self.label_2 = QtWidgets.QLabel(Dialog) 52 | self.label_2.setStyleSheet("font-size: 16px;") 53 | self.label_2.setIndent(2) 54 | self.label_2.setObjectName("label_2") 55 | self.gridLayout.addWidget(self.label_2, 0, 1, 1, 3) 56 | spacerItem = QtWidgets.QSpacerItem(254, 27, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) 57 | self.gridLayout.addItem(spacerItem, 2, 0, 1, 2) 58 | 59 | self.retranslateUi(Dialog) 60 | QtCore.QMetaObject.connectSlotsByName(Dialog) 61 | 62 | def retranslateUi(self, Dialog): 63 | _translate = QtCore.QCoreApplication.translate 64 | Dialog.setWindowTitle(_translate("Dialog", "Dialog")) 65 | self.pushButton.setText(_translate("Dialog", "好的")) 66 | self.label.setText(_translate("Dialog", "下载&配置游戏完成")) 67 | self.label_2.setText(_translate("Dialog", "提示")) 68 | -------------------------------------------------------------------------------- /MC_Dowmloader_UI.py: -------------------------------------------------------------------------------- 1 | # Form implementation generated from reading ui file '/Users/xyj/.npm/ssh/UI/UI/MC_Dowmloader_UI.ui' 2 | # 3 | # Created by: PyQt6 UI code generator 6.3.1 4 | # 5 | # WARNING: Any manual changes made to this file will be lost when pyuic6 is 6 | # run again. Do not edit this file unless you know what you are doing. 7 | 8 | 9 | from PyQt6 import QtCore, QtGui, QtWidgets 10 | import MOS_rc 11 | 12 | class Ui_MOS_D_MC_Dialog(object): 13 | def setupUi(self, MOS_D_MC_Dialog): 14 | MOS_D_MC_Dialog.setObjectName("MOS_D_MC_Dialog") 15 | MOS_D_MC_Dialog.resize(560, 245) 16 | MOS_D_MC_Dialog.setMinimumSize(QtCore.QSize(560, 245)) 17 | MOS_D_MC_Dialog.setMaximumSize(QtCore.QSize(560, 245)) 18 | MOS_D_MC_Dialog.setStyleSheet("QDialog{background-color: rgb(255, 255, 255);}\n" 19 | "\n" 20 | "QScrollArea{border-style:none;}\n" 21 | "QPushButton{border:2px solid rgba(235, 235, 235,0);height:25px;border-radius:5px;}\n" 22 | "QPushButton::hover{background-color: rgb(192, 192, 192);}\n" 23 | "QPushButton::pressed{background-color: rgb(169, 169, 169);}") 24 | self.gridLayout = QtWidgets.QGridLayout(MOS_D_MC_Dialog) 25 | self.gridLayout.setContentsMargins(12, 12, 12, 12) 26 | self.gridLayout.setObjectName("gridLayout") 27 | self.label = QtWidgets.QLabel(MOS_D_MC_Dialog) 28 | self.label.setObjectName("label") 29 | self.gridLayout.addWidget(self.label, 0, 0, 1, 1) 30 | self.scrollArea = QtWidgets.QScrollArea(MOS_D_MC_Dialog) 31 | self.scrollArea.setStyleSheet("QScrollArea{border-style:none;background-color: rgba(255, 255, 255, 0);}\n" 32 | "QPushButton{border:2px solid rgba(235, 235, 235,0);height:25px;border-radius:5px;}\n" 33 | "QPushButton::hover{background-color: rgb(192, 192, 192);}\n" 34 | "QPushButton::pressed{background-color: rgb(169, 169, 169);}\n" 35 | "\n" 36 | "QProgressBar{\n" 37 | " text-align: center;border-style:none;border-radius:5px;background-color: rgb(235, 235, 235);height:3px;color: rgb(66, 66, 66);\n" 38 | "}\n" 39 | "QProgressBar::chunk{\n" 40 | " border-radius:5px;\n" 41 | " background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(64, 183, 255, 255), stop:1 rgba(67, 146, 255, 255));\n" 42 | "}\n" 43 | "\n" 44 | "QScrollArea{border-style:none;background-color: rgba(255, 255, 255, 0);}\n" 45 | "/*设置垂直滚动条基本样式*/\n" 46 | "QScrollBar:vertical\n" 47 | "{\n" 48 | " width:8px;\n" 49 | " background:rgba(0,0,0,0%);\n" 50 | " margin:0px,0px,0px,0px;\n" 51 | " padding-top:9px; /*留出9px给上面和下面的箭头*/\n" 52 | " padding-bottom:9px;\n" 53 | "}\n" 54 | "QScrollBar::handle:vertical\n" 55 | "{\n" 56 | " width:8px;\n" 57 | " background: rgb(214, 214, 214);\n" 58 | " border-radius:3px; /*滚动条两端变成椭圆*/\n" 59 | " min-height:;\n" 60 | "}\n" 61 | "QScrollBar::handle:vertical:hover\n" 62 | "{\n" 63 | " width:8px;\n" 64 | " background:rgb(192, 192, 192); /* 鼠标放到滚动条上的时候,颜色变深*/\n" 65 | " border-radius:4px;\n" 66 | " min-height:;\n" 67 | "}\n" 68 | "QScrollBar::add-line:vertical /*这个应该是设置下箭头的,3.png就是箭头*/\n" 69 | "{\n" 70 | " height:9px;width:8px;\n" 71 | " border-image:url(:/img/picture/caret-down_1.png);\n" 72 | " subcontrol-position:bottom;\n" 73 | "}\n" 74 | "QScrollBar::sub-line:vertical /*设置上箭头*/\n" 75 | "{\n" 76 | " height:9px;width:8px;\n" 77 | " border-image:url(:/img/picture/caret-up_1.png);\n" 78 | " subcontrol-position:top;\n" 79 | "}\n" 80 | "QScrollBar::add-line:vertical:hover /*当鼠标放到下箭头上的时候*/\n" 81 | "{\n" 82 | " height:9px;width:8px;\n" 83 | " border-image:url(:/img/picture/caret-down.png);\n" 84 | " subcontrol-position:bottom;\n" 85 | "}\n" 86 | "QScrollBar::sub-line:vertical:hover /*当鼠标放到下箭头上的时候*/\n" 87 | "{\n" 88 | " height:9px;width:8px;\n" 89 | " border-image:url(:/img/picture/caret-up.png);\n" 90 | " subcontrol-position:top;\n" 91 | "}\n" 92 | "QScrollBar::sub-page:vertical,QScrollBar::add-page:vertical /*当滚动条滚动的时候,上面的部分和下面的部分*/\n" 93 | "{\n" 94 | " background: rgba(235, 235, 235,150);\n" 95 | " border-radius:4px;\n" 96 | "}\n" 97 | "QScrollBar::add-page:vertical,QScrollBar::sub-page:vertical /*当滚动条滚动的时候,上面的部分和下面的部分*/\n" 98 | "{\n" 99 | " background: rgba(235, 235, 235,150);\n" 100 | " border-radius:4px;\n" 101 | "}") 102 | self.scrollArea.setLineWidth(1) 103 | self.scrollArea.setWidgetResizable(True) 104 | self.scrollArea.setObjectName("scrollArea") 105 | self.scrollAreaWidgetContents = QtWidgets.QWidget() 106 | self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 536, 222)) 107 | self.scrollAreaWidgetContents.setStyleSheet("background-color: rgba(255, 255, 255, 0);") 108 | self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents") 109 | self.verticalLayout = QtWidgets.QVBoxLayout(self.scrollAreaWidgetContents) 110 | self.verticalLayout.setObjectName("verticalLayout") 111 | self.label_2 = QtWidgets.QLabel(self.scrollAreaWidgetContents) 112 | self.label_2.setObjectName("label_2") 113 | self.verticalLayout.addWidget(self.label_2) 114 | self.progressBar = QtWidgets.QProgressBar(self.scrollAreaWidgetContents) 115 | self.progressBar.setMinimum(0) 116 | self.progressBar.setMaximum(105) 117 | self.progressBar.setProperty("value", 0) 118 | self.progressBar.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) 119 | self.progressBar.setTextVisible(True) 120 | self.progressBar.setObjectName("progressBar") 121 | self.verticalLayout.addWidget(self.progressBar) 122 | self.label_3 = QtWidgets.QLabel(self.scrollAreaWidgetContents) 123 | self.label_3.setObjectName("label_3") 124 | self.verticalLayout.addWidget(self.label_3) 125 | self.progressBar_2 = QtWidgets.QProgressBar(self.scrollAreaWidgetContents) 126 | self.progressBar_2.setMaximum(0) 127 | self.progressBar_2.setProperty("value", 0) 128 | self.progressBar_2.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) 129 | self.progressBar_2.setTextVisible(True) 130 | self.progressBar_2.setInvertedAppearance(False) 131 | self.progressBar_2.setObjectName("progressBar_2") 132 | self.verticalLayout.addWidget(self.progressBar_2) 133 | self.label_6 = QtWidgets.QLabel(self.scrollAreaWidgetContents) 134 | self.label_6.setObjectName("label_6") 135 | self.verticalLayout.addWidget(self.label_6) 136 | self.progressBar_4 = QtWidgets.QProgressBar(self.scrollAreaWidgetContents) 137 | self.progressBar_4.setMaximum(0) 138 | self.progressBar_4.setProperty("value", 0) 139 | self.progressBar_4.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) 140 | self.progressBar_4.setTextVisible(False) 141 | self.progressBar_4.setInvertedAppearance(False) 142 | self.progressBar_4.setObjectName("progressBar_4") 143 | self.verticalLayout.addWidget(self.progressBar_4) 144 | self.label_4 = QtWidgets.QLabel(self.scrollAreaWidgetContents) 145 | self.label_4.setObjectName("label_4") 146 | self.verticalLayout.addWidget(self.label_4) 147 | self.progressBar_3 = QtWidgets.QProgressBar(self.scrollAreaWidgetContents) 148 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Fixed) 149 | sizePolicy.setHorizontalStretch(0) 150 | sizePolicy.setVerticalStretch(0) 151 | sizePolicy.setHeightForWidth(self.progressBar_3.sizePolicy().hasHeightForWidth()) 152 | self.progressBar_3.setSizePolicy(sizePolicy) 153 | self.progressBar_3.setMaximum(0) 154 | self.progressBar_3.setProperty("value", 0) 155 | self.progressBar_3.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) 156 | self.progressBar_3.setTextVisible(True) 157 | self.progressBar_3.setInvertedAppearance(False) 158 | self.progressBar_3.setObjectName("progressBar_3") 159 | self.verticalLayout.addWidget(self.progressBar_3) 160 | self.scrollArea.setWidget(self.scrollAreaWidgetContents) 161 | self.gridLayout.addWidget(self.scrollArea, 1, 0, 2, 2) 162 | self.label_5 = QtWidgets.QLabel(MOS_D_MC_Dialog) 163 | self.label_5.setObjectName("label_5") 164 | self.gridLayout.addWidget(self.label_5, 3, 0, 1, 1) 165 | self.pushButton = QtWidgets.QPushButton(MOS_D_MC_Dialog) 166 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Fixed) 167 | sizePolicy.setHorizontalStretch(0) 168 | sizePolicy.setVerticalStretch(0) 169 | sizePolicy.setHeightForWidth(self.pushButton.sizePolicy().hasHeightForWidth()) 170 | self.pushButton.setSizePolicy(sizePolicy) 171 | self.pushButton.setMinimumSize(QtCore.QSize(150, 30)) 172 | self.pushButton.setMaximumSize(QtCore.QSize(150, 30)) 173 | self.pushButton.setObjectName("pushButton") 174 | self.gridLayout.addWidget(self.pushButton, 3, 1, 1, 1) 175 | 176 | self.retranslateUi(MOS_D_MC_Dialog) 177 | QtCore.QMetaObject.connectSlotsByName(MOS_D_MC_Dialog) 178 | 179 | def retranslateUi(self, MOS_D_MC_Dialog): 180 | _translate = QtCore.QCoreApplication.translate 181 | MOS_D_MC_Dialog.setWindowTitle(_translate("MOS_D_MC_Dialog", "Dialog")) 182 | self.label.setText(_translate("MOS_D_MC_Dialog", "安装游戏")) 183 | self.label_2.setText(_translate("MOS_D_MC_Dialog", "下载主文件")) 184 | self.label_3.setText(_translate("MOS_D_MC_Dialog", "下载资源库文件")) 185 | self.progressBar_2.setFormat(_translate("MOS_D_MC_Dialog", "%v/%m")) 186 | self.label_6.setText(_translate("MOS_D_MC_Dialog", "下载依赖库文件")) 187 | self.progressBar_4.setFormat(_translate("MOS_D_MC_Dialog", "%v/%m")) 188 | self.label_4.setText(_translate("MOS_D_MC_Dialog", "安装游戏")) 189 | self.progressBar_3.setFormat(_translate("MOS_D_MC_Dialog", "%p%")) 190 | self.label_5.setText(_translate("MOS_D_MC_Dialog", "0 MB/S - 正在准备下载")) 191 | self.pushButton.setText(_translate("MOS_D_MC_Dialog", "取消")) 192 | -------------------------------------------------------------------------------- /MOS.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/MOS.icns -------------------------------------------------------------------------------- /MOS.py: -------------------------------------------------------------------------------- 1 | def except_hook(cls, exception, traceback): 2 | '''报错显示''' 3 | sys.__excepthook__(cls, exception, traceback) 4 | 5 | # 子进程要执行的代码 6 | def run_ui(): 7 | from MOS_print_ import MOS_print 8 | MOS_print("info","加速进程开始导入库!") 9 | import sys 10 | from PyQt6.QtWidgets import QApplication,QMainWindow 11 | import MOS_start_loading 12 | MOS_print("info","加速进程的Ui程序已开始运行!") 13 | app = QApplication(sys.argv) 14 | sys.excepthook = except_hook 15 | MOS_print("info","加速进程正在运行……请稍等...") 16 | MainWindow = QMainWindow() 17 | MOS_print("info","加速进程 创建窗口对象成功!") 18 | ui = MOS_start_loading.Ui_MainWindow() 19 | MOS_print("info","加速进程 创建PyQt窗口对象成功!") 20 | ui.setupUi(MainWindow) 21 | MOS_print("info","加速进程 初始化设置成功!") 22 | MainWindow.show() 23 | MOS_print("info","加速进程 已成功显示窗体") 24 | sys.exit(app.exec()) 25 | 26 | 27 | if __name__ == '__main__': 28 | try: 29 | import time,traceback 30 | from MOS_print_ import MOS_print 31 | import sys,os 32 | import MOS_UI_Main 33 | from MOS_start_loading import Ui_MainWindow 34 | 35 | a = str(sys.platform) 36 | if a == "darwin": 37 | MOS_print("info",'当前系统为Mac') 38 | user_name = os.getlogin() 39 | # 获取当前系统用户目录 40 | user_home = os.path.expanduser('~') 41 | file = user_home + '/Documents' 42 | else: 43 | file = '' 44 | 45 | MOS_print("info","Ui程序已开始运行!") 46 | sys.excepthook = except_hook 47 | MOS_print("info","请稍等...") 48 | 49 | ui = MOS_UI_Main.start() 50 | 51 | except KeyboardInterrupt: 52 | MOS_print("info","程序以强行退出") 53 | except: 54 | error = traceback.print_exc() 55 | if error == None: 56 | MOS_print("error","出现了一个None,如果您确定这是在您退出窗口后出现的,那么请忽略。如果不是,建议提交反馈。错误已打印") 57 | MOS_print("error",error) 58 | else: 59 | MOS_print("error",error) -------------------------------------------------------------------------------- /MOS_Downloader.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Time : 2020/5/5 22:18 3 | # @Author: 哦嚯嚯哦 4 | # @File : test_demo.py 5 | # @tool : PyCharm 6 | 7 | """ 8 | 使用python实现百行代码高速下载,同IDM 9 | 使用Dowmloader_调用下载 10 | """ 11 | import MOS_UI 12 | 13 | """建议用这个 经过我测试 这个最稳定 经常是最快的""" 14 | import os 15 | import time 16 | import sys 17 | from requests import get,head 18 | from concurrent.futures import ThreadPoolExecutor,wait 19 | 20 | j = 0 #进度 21 | w = "0 KB/s - 正在准备下载" #网速 22 | size = 0 23 | pool = '' 24 | 25 | #网速获取和 进度获取 26 | 27 | def w_h(): 28 | """网速获取""" 29 | return w 30 | 31 | def j_h(): 32 | """进度获取""" 33 | return j 34 | 35 | def s_h(): 36 | """大小获取 没有开始的时候 为0 """ 37 | return size 38 | 39 | def stop(): 40 | pool.shutdown(wait=False) 41 | 42 | class Downloader(): 43 | def __init__(self, url, nums, file): 44 | self.url = url # url链接 45 | self.num = nums # 线程数 46 | self.name = file # 文件名字(路径) 47 | self.getSize = 0 # 大小 48 | self.info = { 49 | 'main': { 50 | 'progress': 0, 51 | 'speed': '' 52 | }, 53 | 'sub': { 54 | 'progress': [0 for i in range(nums)], # 子线程状态 55 | 'stat': [1 for i in range(nums)] # 下载状态 56 | } 57 | } 58 | r = head(self.url, allow_redirects=False) # 禁止自动重定向 59 | # 状态码显示302则迭代寻找文件 60 | while True: 61 | if r.status_code == 302 or 301: 62 | print(r.headers) 63 | 64 | try: 65 | self.url = r.headers['Location'] 66 | except KeyError: 67 | print('状态码为' + str(r.status_code) + ' 请求头内无location值 重定向失败') 68 | break 69 | 70 | print("此url已重定向至 " + format(self.url)) 71 | r = head(self.url,allow_redirects=False) # 禁止自动重定向 72 | else: 73 | break 74 | 75 | self.size = int(r.headers['Content-Length']) 76 | global size 77 | size = self.size 78 | print('该文件大小为: {} bytes'.format(self.size)) 79 | 80 | # ************************************************** # 81 | def Dowmloader_(url, thread_num, file): 82 | """ 83 | url=地址 thread_num=线程数量 file=保存路径(要写全) 84 | """ 85 | down = Downloader(url, thread_num, file) 86 | a = down.run() 87 | return a 88 | 89 | # ************************************************** # 90 | 91 | 92 | def down(self, start, end, thread_id, chunk_size = 99200): 93 | raw_start = start 94 | for _ in range(10): 95 | try: 96 | headers = {'User-Agent':'Mozilla/55.0 (Macintosh; Intel Mac OS X 55.55; rv:101.0) Gecko/20100101 Firefox/101.0', 97 | 'Range': 'bytes={}-{}'.format(start, end)} 98 | r = get(self.url, headers=headers, timeout=10, stream=True) 99 | print(f"线程{thread_id}连接成功") 100 | size = 0 101 | with open(self.name, "rb+") as fp: 102 | fp.seek(start) 103 | for chunk in r.iter_content(chunk_size=chunk_size): 104 | if chunk: 105 | self.getSize += chunk_size 106 | fp.write(chunk) 107 | start += chunk_size 108 | size += chunk_size 109 | progress = round(size / (end - raw_start) * 100, 2) 110 | self.info['sub']['progress'][thread_id - 1] = progress 111 | self.info['sub']['stat'][thread_id - 1] = 1 112 | return 113 | except Exception as error: 114 | print(error) 115 | self.down(start, end, thread_id) 116 | print(f"{start}-{end}, 下载失败") 117 | self.info['sub']['start'][thread_id - 1] = 0 118 | 119 | def show(self): 120 | while True: 121 | speed = self.getSize 122 | print(speed) 123 | time.sleep(0.5) 124 | speed = int((self.getSize - speed) * 2 / 1024) 125 | if speed > 1024: 126 | speed = f"{round(speed / 1024, 2)} MB/s" # round() 方法返回浮点数四舍五入值 127 | else: 128 | speed = f"{speed} KB/s" 129 | progress = round(self.getSize / self.size * 100, 2) 130 | self.info['main']['progress'] = progress 131 | self.info['main']['speed'] = speed 132 | b = self.info['main'] 133 | b_2 = int(b['progress']) 134 | b_3 = str(b['speed']) 135 | 136 | global j,w 137 | j = b_2 138 | w = b_3 139 | print(self.info) 140 | 141 | if progress >= 100: 142 | print(self.info) 143 | break 144 | """ 145 | c = self.info['sub']['progress'] 146 | d = len(c) #计算有多少个 147 | e = 0 #存储列表中所有值 148 | for a in c: 149 | e += a 150 | f = e/d 151 | g = 0 152 | for a in c: 153 | #再次循环 看看每一个值是不是和平均值相等 154 | if a == f: 155 | g += 1 #如果是就+1 156 | else: 157 | pass # 如果不是 不做处理 158 | if g == d: 159 | #如果相等的等于 d(值得数量 160 | break #打破循环 161 | else: 162 | pass #继续循环 163 | """ 164 | 165 | def run(self): 166 | # 创建一个要下载的文件 167 | fp = open(self.name, 'wb') 168 | print(f"正在初始化下载文件: {self.name}") 169 | fp.truncate(self.size) 170 | print(f"文件初始化完成") 171 | start_time = time.time() 172 | fp.close() 173 | part = self.size // self.num 174 | global pool 175 | pool = ThreadPoolExecutor(max_workers=self.num + 1) 176 | futures = [] 177 | for i in range(self.num): 178 | start = part * i 179 | if i == self.num - 1: 180 | end = self.size 181 | else: 182 | end = start + part - 1 183 | futures.append(pool.submit(self.down, start, end, i + 1)) 184 | futures.append(pool.submit(self.show)) 185 | print(f"正在使用{self.num}个线程进行下载...") 186 | 187 | start = time.perf_counter() 188 | 189 | wait(futures) 190 | end_time = time.time() 191 | speed = int(self.size / 1024 / (end_time - start_time)) 192 | if speed > 1024: 193 | speed = f"{round(speed / 1024, 2)} M/s" 194 | else: 195 | speed = f"{speed} KB/s" 196 | print(f"{self.name}下载完成,平均速度: {speed}") 197 | 198 | end_time_1 = time.perf_counter() 199 | print("用时" + str(end_time_1)) 200 | 201 | 202 | 203 | 204 | 205 | if __name__ == '__main__': 206 | debug = 1 # 测试情况 207 | if debug: 208 | #url = 'https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/0d/ea/f936c14b6e886221e53354e1992d0c4e0eb9566fcc70201047bb664ce777/tensorflow-2.3.1-cp37-cp37m-macosx_10_9_x86_64.whl#sha256=1f72edee9d2e8861edbb9e082608fd21de7113580b3fdaa4e194b472c2e196d0' 209 | url = 'https://download.visualstudio.microsoft.com/download/pr/cc04076c-d188-4c20-9b4f-89be06f1a39c/32da746ef46fbeedb4f609b67cb451c3/windowsdesktop-runtime-6.0.6-win-x86.exe' 210 | #url = 'https://visualstudio.microsoft.com/aabf4bb0-b5f4-4e42-8aae-6ad17ec46db2' 211 | #url = 'https://file.skyworldstudio.top/d/SoftwareRelease/MOS/Publish/2.0.4-alpha/2.0.4-alpha-win.zip' 212 | #url = 'https://download.visualstudio.microsoft.com/download/pr/ca7c7580-dd29-42d8-a0b1-3223e61f1623/b38739f51587806a5751419435d6c4ad/visualstudioformacinstaller-17.0.4.5.dmg' 213 | down = Downloader(url, 8, os.path.basename(url)) 214 | else: 215 | # 命令行执行方式 216 | url = sys.argv[1] # 下载链接 217 | file = sys.argv[2] # 默认保存在项目路径下,文件的名字以文件格式结尾 218 | thread_num = int(sys.argv[3]) # 使用的线程数量 219 | down = Downloader(url, thread_num, file) 220 | down.run() 221 | 222 | -------------------------------------------------------------------------------- /MOS_print_.py: -------------------------------------------------------------------------------- 1 | """ 2 | MOS的print 3 | 由于文件名和模块一摸一样会报错 所以我加了个下划线 4 | """ 5 | import datetime 6 | 7 | # 日志系统 这个列表是暂存的 主窗口会定时 获取 -> 写入 -> 清空 (全局变量) 8 | r = [] 9 | 10 | def r_h(): 11 | """获取日志""" 12 | global r 13 | return r 14 | 15 | def q_h(): 16 | """清空日志""" 17 | global r 18 | r = [] 19 | 20 | 21 | 22 | 23 | class MOS_print_colour: 24 | ''' 25 | HEADER:偏粉的紫色(?) 26 | OKBLUE:蓝色 27 | OKCYAN:青色 28 | OKGREEN:绿色 29 | WARNING:黄色 30 | FAIL:红色 31 | FAIL_2:加粗的红色 32 | FAIL_3:有下划线的红色 33 | ENDC:正常的黑色 34 | BOLD:加粗的黑色 35 | UNDERLINE:有下横线的黑色 36 | ''' 37 | HEADER = '\033[95m' 38 | OKBLUE = '\033[94m' 39 | OKCYAN = '\033[96m' 40 | OKGREEN = '\033[92m' 41 | WARNING = '\033[93m' 42 | FAIL = '\033[91m' 43 | FAIL_2 = '\033[1;91m' 44 | FAIL_3 = '\033[4;91m' 45 | ENDC = '\033[0m' 46 | BOLD = '\033[1m' 47 | UNDERLINE = '\033[4m' 48 | 49 | def MOS_print(type_,MOS_print_1): 50 | '''type_{[error,错误] [info,提示]}''' 51 | global r 52 | MOS_print = str(MOS_print_1) 53 | MOS_time = datetime.datetime.now().strftime('%H:%M:%S.%f') 54 | if type_ == 'error': 55 | tybe_1 = 'ERROR' 56 | tybe_2 = MOS_print_colour.FAIL_3 + tybe_1 + MOS_print_colour.ENDC 57 | MOS_time_2 = MOS_print_colour.FAIL_3 + MOS_time + MOS_print_colour.ENDC 58 | left = MOS_print_colour.FAIL + '[' + MOS_print_colour.ENDC 59 | right = MOS_print_colour.FAIL + ']' +MOS_print_colour.ENDC 60 | p = left + MOS_time_2 + right + left + tybe_2 + right + MOS_print_colour.FAIL_2 + MOS_print + MOS_print_colour.ENDC 61 | print(p) 62 | p_1 = MOS_time + tybe_1 + MOS_print + '\n' 63 | 64 | elif type_ == 'info': 65 | tybe_1 = 'INFO' 66 | left = MOS_print_colour.ENDC + '[' + MOS_print_colour.ENDC 67 | right = MOS_print_colour.ENDC + ']' +MOS_print_colour.ENDC 68 | tybe_2 = MOS_print_colour.UNDERLINE + tybe_1 + MOS_print_colour.ENDC 69 | MOS_time_2 = MOS_print_colour.UNDERLINE + MOS_time + MOS_print_colour.ENDC 70 | p = left + MOS_time_2 + right + left + tybe_2 + right + MOS_print_colour.ENDC + MOS_print + MOS_print_colour.ENDC 71 | print(p) 72 | p_1 = '[' + MOS_time + '][' + tybe_1 + ']' + MOS_print + '\n' 73 | 74 | r.append(p_1) -------------------------------------------------------------------------------- /MOS_start_loading.py: -------------------------------------------------------------------------------- 1 | # Form implementation generated from reading ui file '/Users/xyj/.npm/ssh/UI/UI/MOS_start_loading.ui' 2 | # 3 | # Created by: PyQt6 UI code generator 6.3.1 4 | # 5 | # WARNING: Any manual changes made to this file will be lost when pyuic6 is 6 | # run again. Do not edit this file unless you know what you are doing. 7 | 8 | 9 | from PyQt6 import QtCore, QtGui, QtWidgets 10 | from PyQt6.QtCore import QTimer 11 | from PyQt6.QtWidgets import QMainWindow 12 | import MOS_start_loading_rc 13 | 14 | class Ui_MainWindow(object): 15 | def setupUi(self, MainWindow): 16 | MainWindow.setObjectName("MainWindow") 17 | MainWindow.setEnabled(True) 18 | MainWindow.resize(175, 175) 19 | MainWindow.setMinimumSize(QtCore.QSize(175, 175)) 20 | MainWindow.setMaximumSize(QtCore.QSize(175, 175)) 21 | MainWindow.setCursor(QtGui.QCursor(QtCore.Qt.CursorShape.WaitCursor)) 22 | MainWindow.setMouseTracking(True) 23 | MainWindow.setWindowOpacity(1.0) 24 | MainWindow.setToolTipDuration(0) 25 | MainWindow.setStyleSheet("") 26 | MainWindow.setIconSize(QtCore.QSize(100, 100)) 27 | MainWindow.setTabShape(QtWidgets.QTabWidget.TabShape.Rounded) 28 | MainWindow.setDockOptions(QtWidgets.QMainWindow.DockOption.AllowTabbedDocks|QtWidgets.QMainWindow.DockOption.AnimatedDocks) 29 | MainWindow.setUnifiedTitleAndToolBarOnMac(False) 30 | 31 | MainWindow.setWindowFlags(QtCore.Qt.WindowType.WindowStaysOnTopHint | QtCore.Qt.WindowType.FramelessWindowHint) # 置顶,且去掉边框 32 | MainWindow.setAttribute(QtCore.Qt.WidgetAttribute.WA_TranslucentBackground) # 窗体背景透明 33 | 34 | self.centralwidget = QtWidgets.QWidget(MainWindow) 35 | self.centralwidget.setObjectName("centralwidget") 36 | self.gridLayout = QtWidgets.QGridLayout(self.centralwidget) 37 | self.gridLayout.setContentsMargins(0, 0, 0, 0) 38 | self.gridLayout.setSpacing(0) 39 | self.gridLayout.setObjectName("gridLayout") 40 | self.label = QtWidgets.QLabel(self.centralwidget) 41 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Preferred, QtWidgets.QSizePolicy.Policy.Preferred) 42 | sizePolicy.setHorizontalStretch(0) 43 | sizePolicy.setVerticalStretch(0) 44 | sizePolicy.setHeightForWidth(self.label.sizePolicy().hasHeightForWidth()) 45 | self.label.setSizePolicy(sizePolicy) 46 | self.label.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) 47 | self.label.setStyleSheet("border-image: url(:/img/ico.png);") 48 | self.label.setObjectName("label") 49 | self.gridLayout.addWidget(self.label, 0, 0, 1, 1) 50 | MainWindow.setCentralWidget(self.centralwidget) 51 | 52 | self.retranslateUi(MainWindow) 53 | QtCore.QMetaObject.connectSlotsByName(MainWindow) 54 | 55 | def retranslateUi(self, MainWindow): 56 | _translate = QtCore.QCoreApplication.translate 57 | MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) 58 | self.label.setText(_translate("MainWindow", "


")) 59 | 60 | self.a = QTimer() 61 | self.a.start(5000) #开始计时器 62 | self.a.timeout.connect(self.A) #要执行的槽 63 | 64 | def A(self): 65 | quit() 66 | 67 | -------------------------------------------------------------------------------- /MOS_versions.json: -------------------------------------------------------------------------------- 1 | { 2 | "2.0.4":"V2.0.4-alpha", 3 | "2.0.5":"V2.0.5-alpha", 4 | "2.0.6":"V2.0.6-alpha", 5 | "2.0.7":"V2.0.7-alpha" 6 | } -------------------------------------------------------------------------------- /Mac非app启动.command: -------------------------------------------------------------------------------- 1 | python3 MOS.py -------------------------------------------------------------------------------- /Mod.rtfd/TXT.rtf: -------------------------------------------------------------------------------- 1 | {\rtf1\ansi\ansicpg936\cocoartf2580 2 | \cocoatextscaling0\cocoaplatform0{\fonttbl\f0\fnil\fcharset0 HelveticaNeue;} 3 | {\colortbl;\red255\green255\blue255;\red43\green166\blue104;\red0\green0\blue0;} 4 | {\*\expandedcolortbl;;\cssrgb\c18824\c69804\c48235;\cssrgb\c0\c0\c0;} 5 | \paperw11900\paperh16840\margl1440\margr1440\vieww21440\viewh8400\viewkind0 6 | \deftab720 7 | \pard\pardeftab720\sa400\partightenfactor0 8 | 9 | \f0\fs32 \cf2 \expnd0\expndtw0\kerning0 10 | https://api.modrinth.com/v2/search?limit=20&index=relevance&facets=[["categories:adventure"],["categories:fabric"],["versions:1.17.1"]]\ 11 | \ 12 | \ 13 | \ 14 | https://api.modrinth.com/v2/search?limit=20&index=relevance&facets=[["categories:adventure"],["categories:fabric"],["versions:1.16.1\'94]]\ 15 | \ 16 | \ 17 | https://api.modrinth.com/v2/search?limit=20&index=relevance&facets=[["categories:adventure"],["categories:fabric"],["versions:1.16.5\'94]]\ 18 | \ 19 | \pard\pardeftab720\sa400\partightenfactor0 20 | \cf3 https://api.modrinth.com/v2/search?limit=20&index=relevance&facets=%5B%5B%22categories:adventure%22%5D,%5B%22categories:fabric%22%5D,%5B%22versions:1.16.5%22%5D%5D\ 21 | \ 22 | https://api.modrinth.com/v2/search?limit=20&index=relevance&facets=%5B%5B%22categories:adventure%22%5D,%5B%22categories:fabric%22%5D,%5B%22versions:1.16.5%22%5D%5D\ 23 | \pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\partightenfactor0 24 | \cf2 \ 25 | \pard\pardeftab720\sa400\partightenfactor0 26 | \cf3 https://api.modrinth.com/v2/search?limit=20&index=relevance&facets=[["categories:adventure"],["categories:fabric"],["versions:1.16.5\'94]]\cf2 \ 27 | \ 28 | \ 29 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MOS2已停止开发,请移步[SkyWorldStudio/Minecraft-Optimal-Starter_3](https://github.com/SkyWorldStudio/Minecraft-Optimal-Starter_3) 2 | 3 | 4 |
5 | 6 |

7 | 8 |

9 | 10 | # 我的世界MOS 2 启动器 11 | 12 | [![OSCS Status](https://www.oscs1024.com/platform/badge/xianyongjian080402/Minecraft-Optimal-Starter_2.svg?size=small)](https://www.oscs1024.com/project/xianyongjian080402/Minecraft-Optimal-Starter_2?ref=badge_small) 13 | [![star](https://gitee.com/xian66/minecraft-optimal-starter_2/badge/star.svg?theme=dark)](https://gitee.com/xian66/minecraft-optimal-starter_2/stargazers) 14 | [![fork](https://gitee.com/xian66/minecraft-optimal-starter_2/badge/fork.svg?theme=dark)](https://gitee.com/xian66/minecraft-optimal-starter_2/members) 15 | [![GitHub issues](https://img.shields.io/github/issues/xianyongjian080402/Minecraft-Optimal-Starter_2)](https://github.com/xianyongjian080402/Minecraft-Optimal-Starter_2/issues) 16 | [![GitHub stars](https://img.shields.io/github/stars/xianyongjian080402/Minecraft-Optimal-Starter_2?color=yellow)](https://github.com/xianyongjian080402/Minecraft-Optimal-Starter_2/stargazers) 17 | [![GitHub license](https://img.shields.io/github/license/xianyongjian080402/Minecraft-Optimal-Starter_2)](https://github.com/xianyongjian080402/Minecraft-Optimal-Starter_2/blob/master/LICENSE) 18 | [![GitHub forks](https://img.shields.io/github/forks/xianyongjian080402/Minecraft-Optimal-Starter_2)](https://github.com/xianyongjian080402/Minecraft-Optimal-Starter_2/network) 19 | ![GitHub release (latest by date including pre-releases)](https://img.shields.io/github/v/release/xianyongjian080402/Minecraft-Optimal-Starter_2?include_prereleases) 20 | ![Python release (python.org)](https://img.shields.io/badge/Python-3.8-brightgreen) 21 | ![pt](https://img.shields.io/badge/平台-Win%20Mac%20Linux-critical) 22 | 23 | [![xianyongjian080402/Minecraft-Optimal-Starter_2](https://gitee.com/xian66/minecraft-optimal-starter_2/widgets/widget_card.svg?colors=4183c4,ffffff,ffffff,e3e9ed,666666,9b9b9b)](https://gitee.com/xian66/minecraft-optimal-starter_2) 24 | 25 | [![Alt](https://repobeats.axiom.co/api/embed/b690a0a750143858f38209f1a9fb619146492357.svg "Repobeats analytics image")](https://repobeats.axiom.co/) 26 | 27 |
28 | 29 | ## 介绍 📃 30 | 🥳 MOS ll 全称[Minecraft-Optimal-Starter](https://github.com/xianyongjian080402/Minecraft-Optimal-Starter_issue) ll 中文名称为 MOS我的世界启动器,由David ²⁰²² 发起 正在申请入驻 [SWS](https://skyworldstudio.top) 工作室 (本人已是[SWS](https://skyworldstudio.top)工作室成员)MOS启动器可以让更多的玩家启动游戏,并且具有简单启动、下载速度快、不需安装Java、跨平台 等特点 🥳 31 | 32 | --- 33 | 34 | 35 | ## 启动器下载 ❤ 36 | 37 | ⬇️ MOS目前分为 内部测试版 ~~内测版~~ ~~公测版~~ ⚠️ 目前不发布 公测/内测版 因为项目未公开,
大家也可直接[下载(Github)](https://github.com/xianyongjian080402/Minecraft-Optimal-Starter_2/releases/) [下载(Gitee)](https://gitee.com/xian66/minecraft-optimal-starter_2/releases/) 38 | 39 | --- 40 | 41 | 42 | ## 依赖 🐕‍🦺 (小白不要看这个,直接去[Gitee](https://gitee.com/xian66/minecraft-optimal-starter_2/releases/)或[Github](https://github.com/xianyongjian080402/Minecraft-Optimal-Starter_2/releases/)下载版本) 43 | 44 | 1. 🤖 首先,需要安装[Python3](https://www.python.org) (建议最新版本,当然,其他版本也可以) 🤖 45 | 1. 🤖 PyQt5/6 环境(教程自己百度),⚠️windows版请使用PyQt5,Mac版及其其他请使用PyQt6⚠️ 🤖 46 | 1. 之后下载 “有环境版” 运行 即可(过段时间发布) 47 | 48 | --- 49 | 50 | 51 | ## 功能 ⏫ 52 | 53 | - ⚙️ 简单的启动:还怕不会安装Java?找不到Java安装包?没关系MOS会为您处理这些事情,并且不需要安装!避免Java增加系统的负担!⚙️ 54 | - 😋 优美的动画:使用MOS动画引擎制作出最流畅,丝滑的全新MOS!(⚠️ 目前正在开发中……)😋 55 | - 🖨️ 优秀的分析:MOS内置了独一无二的崩溃分析器,可以智能分析游戏崩溃的原因,迅速解决问题!⚠️正在开发中 🖨️ 56 | - 🔗 更好的联机:MOS使用多种协议 多种联机方式(支持P2P TCP)!并且智能自动选择节点! 57 | - 🥳 高速的下载:MOS为用户提供更快速的下载服务,让用户能更快下载游戏!🥳 58 | - 🎉 精美的界面:MOS拥有简洁、美观、易懂的界面,即使是小白也可以快速掌握!🎉 59 | - 🏃‍♂️ 勤劳的后勤:MOS有官方交流群,有什么使用问题都可以提问,我们会快速为您解答哦~ 🏃‍ 60 | 61 | --- 62 | 63 | 64 | ## 开发、测试人员(无序,内部)👨‍💻 65 | 66 | David ²⁰²² 、Xiaoyi311、HeimNad、[IPv12]ICU-HKEY、北遥吃不胖、百决、迷鹿、“ۣۖิ$ۣۖิ$ۣۖิ$ۣۖิ、Minecraft_氧化铜、相逢何必曾相识 (暴龙战士)、 67 | 68 | --- 69 | 70 | 71 | ## 职务分配(无序,内部)💼 72 | 73 | David ²⁰²² —— 主编、发起者、代码编写
HeimNad —— 网站运营、项目负责人、测试部门组长
Xiaoyi311—— 工作室入驻、Mac版测试
[IPv12]ICU-HKEY —— 测试
北遥吃得胖 —— 测试
百决—— 测试
迷鹿—— 测试
Minecraft_氧化铜—— 测试
“ۣۖิ$ۣۖิ$ۣۖิ$ۣۖิ—— 测试 74 | 75 | --- 76 | 77 | 78 | ### 小声地逼逼 💭 79 | 80 | 由于大部分成员还只是学生,所以没太多时间去开发啦,各位不要催哦,毕竟学业重要嘛~ 81 | -------------------------------------------------------------------------------- /UI/UI/6.py: -------------------------------------------------------------------------------- 1 | 2 | from PyQt5 import QtCore, QtGui, QtWidgets 3 | 4 | 5 | class LoginButton(QtWidgets.QPushButton): 6 | def __init__(self, parent=None): 7 | super().__init__(parent) 8 | 9 | self.setMinimumSize(60, 60) 10 | 11 | self.color1 = QtGui.QColor(240, 53, 218) 12 | self.color2 = QtGui.QColor(61, 217, 245) 13 | 14 | self._animation = QtCore.QVariantAnimation( 15 | self, 16 | valueChanged=self._animate, #值改变 17 | startValue=0.00001, #开始值 18 | endValue=0.9999, #最终值 19 | duration=250 #持续时间 20 | ) 21 | #print(self._animate()) 22 | 23 | def _animate(self, value): 24 | qss = """ 25 | font: 75 10pt "Microsoft YaHei UI"; 26 | font-weight: bold; 27 | color: rgb(255, 255, 255); 28 | border-style: solid; 29 | border-radius:21px; 30 | """ 31 | # self.color1.name() ==> #f035da 32 | grad = "background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 {color1}, stop:{value} {color2}, stop: 1.0 {color1});".format( 33 | color1=self.color1.name(), color2=self.color2.name(), value=value 34 | ) 35 | qss += grad 36 | print(qss) # 动画实现原理:动态改变 按钮 中的渐变效果 37 | self.setStyleSheet(qss) 38 | 39 | def enterEvent(self, event): 40 | self._animation.setDirection(QtCore.QAbstractAnimation.Forward) #动画方向 41 | print("开始") 42 | self._animation.start() 43 | super().enterEvent(event) 44 | 45 | def leaveEvent(self, event): 46 | self._animation.setDirection(QtCore.QAbstractAnimation.Backward) #动画方向 47 | print("结束") 48 | self._animation.start() 49 | super().enterEvent(event) 50 | 51 | if __name__ == "__main__": 52 | import sys 53 | 54 | app = QtWidgets.QApplication(sys.argv) 55 | 56 | w = QtWidgets.QWidget() 57 | lay = QtWidgets.QVBoxLayout(w) 58 | 59 | for i in range(5): 60 | # 添加控件 61 | button = LoginButton() 62 | button.setText("Login") 63 | lay.addWidget(button) 64 | lay.addStretch() 65 | w.resize(640, 480) 66 | w.show() 67 | sys.exit(app.exec_()) -------------------------------------------------------------------------------- /UI/UI/Delete_Game_F_UI.py: -------------------------------------------------------------------------------- 1 | # Form implementation generated from reading ui file '/Users/xyj/.npm/ssh/UI/UI/Delete_Game_F_UI.ui' 2 | # 3 | # Created by: PyQt6 UI code generator 6.3.1 4 | # 5 | # WARNING: Any manual changes made to this file will be lost when pyuic6 is 6 | # run again. Do not edit this file unless you know what you are doing. 7 | 8 | 9 | from PyQt6 import QtCore, QtGui, QtWidgets 10 | 11 | 12 | class Ui_Delete_Game_F_UI_J(object): 13 | def setupUi(self, Delete_Game_F_UI_J): 14 | Delete_Game_F_UI_J.setObjectName("Delete_Game_F_UI_J") 15 | Delete_Game_F_UI_J.resize(622, 127) 16 | Delete_Game_F_UI_J.setMinimumSize(QtCore.QSize(622, 127)) 17 | Delete_Game_F_UI_J.setMaximumSize(QtCore.QSize(622, 127)) 18 | Delete_Game_F_UI_J.setStyleSheet("QDialog{background-color: rgb(255, 255, 255);}\n" 19 | "#pushButton{border:2px solid rgba(235, 235, 235,0);height:25px;border-radius:5px;}\n" 20 | "#pushButton::hover{background-color: rgb(192, 192, 192);}\n" 21 | "#pushButton::pressed{background-color: rgb(169, 169, 169);}\n" 22 | "\n" 23 | "#pushButton_2{background-color: rgba(255, 255, 255, 0);}\n" 24 | "\n" 25 | "#pushButton_3{border:2px solid rgba(235, 235, 235,0);height:25px;border-radius:5px;}\n" 26 | "#pushButton_3::hover{background-color: rgb(192, 192, 192);}\n" 27 | "#pushButton_3::pressed{background-color: rgb(169, 169, 169);}") 28 | self.gridLayout = QtWidgets.QGridLayout(Delete_Game_F_UI_J) 29 | self.gridLayout.setObjectName("gridLayout") 30 | self.pushButton = QtWidgets.QPushButton(Delete_Game_F_UI_J) 31 | self.pushButton.setMinimumSize(QtCore.QSize(100, 30)) 32 | self.pushButton.setStyleSheet("font-size: 14px;") 33 | self.pushButton.setObjectName("pushButton") 34 | self.gridLayout.addWidget(self.pushButton, 2, 4, 1, 3) 35 | self.label_2 = QtWidgets.QLabel(Delete_Game_F_UI_J) 36 | self.label_2.setStyleSheet("font-size: 16px;") 37 | self.label_2.setIndent(2) 38 | self.label_2.setObjectName("label_2") 39 | self.gridLayout.addWidget(self.label_2, 0, 1, 1, 6) 40 | self.pushButton_2 = QtWidgets.QPushButton(Delete_Game_F_UI_J) 41 | self.pushButton_2.setMinimumSize(QtCore.QSize(50, 50)) 42 | self.pushButton_2.setMaximumSize(QtCore.QSize(50, 50)) 43 | self.pushButton_2.setText("") 44 | icon = QtGui.QIcon() 45 | icon.addPixmap(QtGui.QPixmap("/Users/xyj/.npm/ssh/UI/UI/../../picture/trash_red.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) 46 | self.pushButton_2.setIcon(icon) 47 | self.pushButton_2.setIconSize(QtCore.QSize(40, 40)) 48 | self.pushButton_2.setObjectName("pushButton_2") 49 | self.gridLayout.addWidget(self.pushButton_2, 0, 0, 2, 1) 50 | spacerItem = QtWidgets.QSpacerItem(434, 27, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) 51 | self.gridLayout.addItem(spacerItem, 2, 0, 1, 3) 52 | self.label = QtWidgets.QLabel(Delete_Game_F_UI_J) 53 | self.label.setStyleSheet("font-size: 14px;") 54 | self.label.setWordWrap(True) 55 | self.label.setObjectName("label") 56 | self.gridLayout.addWidget(self.label, 1, 1, 1, 6) 57 | self.pushButton_3 = QtWidgets.QPushButton(Delete_Game_F_UI_J) 58 | self.pushButton_3.setMinimumSize(QtCore.QSize(100, 30)) 59 | self.pushButton_3.setObjectName("pushButton_3") 60 | self.gridLayout.addWidget(self.pushButton_3, 2, 3, 1, 1) 61 | 62 | self.retranslateUi(Delete_Game_F_UI_J) 63 | QtCore.QMetaObject.connectSlotsByName(Delete_Game_F_UI_J) 64 | 65 | def retranslateUi(self, Delete_Game_F_UI_J): 66 | _translate = QtCore.QCoreApplication.translate 67 | Delete_Game_F_UI_J.setWindowTitle(_translate("Delete_Game_F_UI_J", "Dialog")) 68 | self.pushButton.setText(_translate("Delete_Game_F_UI_J", "确定")) 69 | self.label_2.setText(_translate("Delete_Game_F_UI_J", "警告")) 70 | self.label.setText(_translate("Delete_Game_F_UI_J", "您确定要删除游戏文件夹吗 这将不会显示在您的游戏列表中 您可以重新添加")) 71 | self.pushButton_3.setText(_translate("Delete_Game_F_UI_J", "取消")) 72 | -------------------------------------------------------------------------------- /UI/UI/Delete_Game_F_UI.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | Delete_Game_F_UI_J 4 | 5 | 6 | 7 | 0 8 | 0 9 | 622 10 | 127 11 | 12 | 13 | 14 | 15 | 622 16 | 127 17 | 18 | 19 | 20 | 21 | 622 22 | 127 23 | 24 | 25 | 26 | Dialog 27 | 28 | 29 | QDialog{background-color: rgb(255, 255, 255);} 30 | #pushButton{border:2px solid rgba(235, 235, 235,0);height:25px;border-radius:5px;} 31 | #pushButton::hover{background-color: rgb(192, 192, 192);} 32 | #pushButton::pressed{background-color: rgb(169, 169, 169);} 33 | 34 | #pushButton_2{background-color: rgba(255, 255, 255, 0);} 35 | 36 | #pushButton_3{border:2px solid rgba(235, 235, 235,0);height:25px;border-radius:5px;} 37 | #pushButton_3::hover{background-color: rgb(192, 192, 192);} 38 | #pushButton_3::pressed{background-color: rgb(169, 169, 169);} 39 | 40 | 41 | 42 | 43 | 44 | 45 | 100 46 | 30 47 | 48 | 49 | 50 | font-size: 14px; 51 | 52 | 53 | 确定 54 | 55 | 56 | 57 | 58 | 59 | 60 | font-size: 16px; 61 | 62 | 63 | 警告 64 | 65 | 66 | 0 67 | 68 | 69 | 2 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 50 78 | 50 79 | 80 | 81 | 82 | 83 | 50 84 | 50 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | ../../picture/trash_red.png../../picture/trash_red.png 93 | 94 | 95 | 96 | 40 97 | 40 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | Qt::Horizontal 106 | 107 | 108 | 109 | 434 110 | 27 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | font-size: 14px; 119 | 120 | 121 | 您确定要删除游戏文件夹吗 这将不会显示在您的游戏列表中 您可以重新添加 122 | 123 | 124 | true 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 100 133 | 30 134 | 135 | 136 | 137 | 取消 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | -------------------------------------------------------------------------------- /UI/UI/Java_Dowmloader.py: -------------------------------------------------------------------------------- 1 | # Form implementation generated from reading ui file '/Users/xyj/.npm/ssh/UI/UI/Java_Dowmloader.ui' 2 | # 3 | # Created by: PyQt6 UI code generator 6.3.1 4 | # 5 | # WARNING: Any manual changes made to this file will be lost when pyuic6 is 6 | # run again. Do not edit this file unless you know what you are doing. 7 | 8 | 9 | -------------------------------------------------------------------------------- /UI/UI/Java_Dowmloader_OK_UI.py: -------------------------------------------------------------------------------- 1 | # Form implementation generated from reading ui file '/Users/xyj/.npm/ssh/UI/UI/Java_Dowmloader_OK_UI.ui' 2 | # 3 | # Created by: PyQt6 UI code generator 6.3.1 4 | # 5 | # WARNING: Any manual changes made to this file will be lost when pyuic6 is 6 | # run again. Do not edit this file unless you know what you are doing. 7 | 8 | 9 | from PyQt6 import QtCore, QtGui, QtWidgets 10 | 11 | 12 | class Ui_Dialog_2(object): 13 | def setupUi(self, Dialog_2): 14 | Dialog_2.setObjectName("Dialog_2") 15 | Dialog_2.resize(505, 120) 16 | Dialog_2.setMinimumSize(QtCore.QSize(505, 120)) 17 | Dialog_2.setMaximumSize(QtCore.QSize(505, 120)) 18 | Dialog_2.setStyleSheet("QDialog{background-color: rgb(255, 255, 255);}\n" 19 | "#pushButton{border:2px solid rgba(235, 235, 235,0);height:25px;border-radius:5px;}\n" 20 | "#pushButton::hover{background-color: rgb(192, 192, 192);}\n" 21 | "#pushButton::pressed{background-color: rgb(169, 169, 169);}\n" 22 | "\n" 23 | "#pushButton_2{background-color: rgba(255, 255, 255, 0);}") 24 | self.gridLayout = QtWidgets.QGridLayout(Dialog_2) 25 | self.gridLayout.setObjectName("gridLayout") 26 | self.pushButton = QtWidgets.QPushButton(Dialog_2) 27 | self.pushButton.setMinimumSize(QtCore.QSize(200, 30)) 28 | self.pushButton.setMaximumSize(QtCore.QSize(200, 30)) 29 | self.pushButton.setStyleSheet("font-size: 14px;") 30 | self.pushButton.setObjectName("pushButton") 31 | self.gridLayout.addWidget(self.pushButton, 2, 3, 1, 1) 32 | self.label_2 = QtWidgets.QLabel(Dialog_2) 33 | self.label_2.setStyleSheet("font-size: 16px;") 34 | self.label_2.setIndent(2) 35 | self.label_2.setObjectName("label_2") 36 | self.gridLayout.addWidget(self.label_2, 0, 2, 1, 2) 37 | self.label = QtWidgets.QLabel(Dialog_2) 38 | self.label.setStyleSheet("font-size: 14px;") 39 | self.label.setObjectName("label") 40 | self.gridLayout.addWidget(self.label, 1, 2, 1, 2) 41 | spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) 42 | self.gridLayout.addItem(spacerItem, 2, 1, 1, 2) 43 | self.pushButton_2 = QtWidgets.QPushButton(Dialog_2) 44 | self.pushButton_2.setMinimumSize(QtCore.QSize(50, 50)) 45 | self.pushButton_2.setMaximumSize(QtCore.QSize(50, 50)) 46 | self.pushButton_2.setText("") 47 | icon = QtGui.QIcon() 48 | icon.addPixmap(QtGui.QPixmap(":/ing/OK.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) 49 | self.pushButton_2.setIcon(icon) 50 | self.pushButton_2.setIconSize(QtCore.QSize(40, 40)) 51 | self.pushButton_2.setObjectName("pushButton_2") 52 | self.gridLayout.addWidget(self.pushButton_2, 0, 1, 2, 1) 53 | 54 | self.retranslateUi(Dialog_2) 55 | QtCore.QMetaObject.connectSlotsByName(Dialog_2) 56 | 57 | def retranslateUi(self, Dialog_2): 58 | _translate = QtCore.QCoreApplication.translate 59 | Dialog_2.setWindowTitle(_translate("Dialog_2", "Dialog")) 60 | self.pushButton.setText(_translate("Dialog_2", "好的")) 61 | self.label_2.setText(_translate("Dialog_2", "提示")) 62 | self.label.setText(_translate("Dialog_2", "下载&配置Java完成")) 63 | -------------------------------------------------------------------------------- /UI/UI/Java_Dowmloader_OK_UI.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | Dialog_2 4 | 5 | 6 | 7 | 0 8 | 0 9 | 505 10 | 120 11 | 12 | 13 | 14 | 15 | 505 16 | 120 17 | 18 | 19 | 20 | 21 | 505 22 | 120 23 | 24 | 25 | 26 | Dialog 27 | 28 | 29 | QDialog{background-color: rgb(255, 255, 255);} 30 | #pushButton{border:2px solid rgba(235, 235, 235,0);height:25px;border-radius:5px;} 31 | #pushButton::hover{background-color: rgb(192, 192, 192);} 32 | #pushButton::pressed{background-color: rgb(169, 169, 169);} 33 | 34 | #pushButton_2{background-color: rgba(255, 255, 255, 0);} 35 | 36 | 37 | 38 | 39 | 40 | 41 | 200 42 | 30 43 | 44 | 45 | 46 | 47 | 200 48 | 30 49 | 50 | 51 | 52 | font-size: 14px; 53 | 54 | 55 | 好的 56 | 57 | 58 | 59 | 60 | 61 | 62 | font-size: 16px; 63 | 64 | 65 | 提示 66 | 67 | 68 | 0 69 | 70 | 71 | 2 72 | 73 | 74 | 75 | 76 | 77 | 78 | font-size: 14px; 79 | 80 | 81 | 下载&配置Java完成 82 | 83 | 84 | 85 | 86 | 87 | 88 | Qt::Horizontal 89 | 90 | 91 | 92 | 40 93 | 20 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 50 103 | 50 104 | 105 | 106 | 107 | 108 | 50 109 | 50 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | :/ing/OK.png:/ing/OK.png 118 | 119 | 120 | 121 | 40 122 | 40 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | -------------------------------------------------------------------------------- /UI/UI/Java_Dowmloader_UI.py: -------------------------------------------------------------------------------- 1 | # Form implementation generated from reading ui file '/Users/xyj/.npm/ssh/UI/UI/Java_Dowmloader_UI.ui' 2 | # 3 | # Created by: PyQt6 UI code generator 6.3.1 4 | # 5 | # WARNING: Any manual changes made to this file will be lost when pyuic6 is 6 | # run again. Do not edit this file unless you know what you are doing. 7 | 8 | 9 | from PyQt6 import QtCore, QtGui, QtWidgets 10 | 11 | 12 | class Ui_Dialog(object): 13 | def setupUi(self, Dialog): 14 | Dialog.setObjectName("Dialog") 15 | Dialog.resize(568, 255) 16 | Dialog.setMinimumSize(QtCore.QSize(568, 255)) 17 | Dialog.setMaximumSize(QtCore.QSize(568, 255)) 18 | Dialog.setStyleSheet("background-color: rgb(255, 255, 255);") 19 | self.verticalLayout = QtWidgets.QVBoxLayout(Dialog) 20 | self.verticalLayout.setObjectName("verticalLayout") 21 | self.label = QtWidgets.QLabel(Dialog) 22 | self.label.setObjectName("label") 23 | self.verticalLayout.addWidget(self.label) 24 | self.scrollArea = QtWidgets.QScrollArea(Dialog) 25 | self.scrollArea.setStyleSheet("QScrollArea{border-style:none;}\n" 26 | "QPushButton{border:2px solid rgba(235, 235, 235,0);height:25px;border-radius:5px;}\n" 27 | "QPushButton::hover{background-color: rgb(192, 192, 192);}\n" 28 | "QPushButton::pressed{background-color: rgb(169, 169, 169);}\n" 29 | "\n" 30 | "QProgressBar{\n" 31 | " text-align: center;border-style:none;border-radius:5px;background-color: rgb(235, 235, 235);height:3px;color: rgb(66, 66, 66);\n" 32 | "}\n" 33 | "QProgressBar::chunk{\n" 34 | " border-radius:5px;\n" 35 | " background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(64, 183, 255, 255), stop:1 rgba(67, 146, 255, 255));\n" 36 | "}") 37 | self.scrollArea.setWidgetResizable(True) 38 | self.scrollArea.setObjectName("scrollArea") 39 | self.scrollAreaWidgetContents = QtWidgets.QWidget() 40 | self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 544, 207)) 41 | self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents") 42 | self.gridLayout = QtWidgets.QGridLayout(self.scrollAreaWidgetContents) 43 | self.gridLayout.setObjectName("gridLayout") 44 | self.label_2 = QtWidgets.QLabel(self.scrollAreaWidgetContents) 45 | self.label_2.setObjectName("label_2") 46 | self.gridLayout.addWidget(self.label_2, 0, 0, 1, 1) 47 | self.label_3 = QtWidgets.QLabel(self.scrollAreaWidgetContents) 48 | self.label_3.setObjectName("label_3") 49 | self.gridLayout.addWidget(self.label_3, 2, 0, 1, 1) 50 | spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding) 51 | self.gridLayout.addItem(spacerItem, 4, 0, 1, 2) 52 | self.label_5 = QtWidgets.QLabel(self.scrollAreaWidgetContents) 53 | self.label_5.setObjectName("label_5") 54 | self.gridLayout.addWidget(self.label_5, 5, 0, 1, 1) 55 | self.pushButton = QtWidgets.QPushButton(self.scrollAreaWidgetContents) 56 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Fixed) 57 | sizePolicy.setHorizontalStretch(0) 58 | sizePolicy.setVerticalStretch(0) 59 | sizePolicy.setHeightForWidth(self.pushButton.sizePolicy().hasHeightForWidth()) 60 | self.pushButton.setSizePolicy(sizePolicy) 61 | self.pushButton.setMinimumSize(QtCore.QSize(150, 30)) 62 | self.pushButton.setMaximumSize(QtCore.QSize(150, 30)) 63 | self.pushButton.setObjectName("pushButton") 64 | self.gridLayout.addWidget(self.pushButton, 5, 1, 1, 1) 65 | self.progressBar = QtWidgets.QProgressBar(self.scrollAreaWidgetContents) 66 | self.progressBar.setMinimum(0) 67 | self.progressBar.setMaximum(110) 68 | self.progressBar.setProperty("value", 50) 69 | self.progressBar.setTextVisible(False) 70 | self.progressBar.setObjectName("progressBar") 71 | self.gridLayout.addWidget(self.progressBar, 1, 0, 1, 2) 72 | self.progressBar_2 = QtWidgets.QProgressBar(self.scrollAreaWidgetContents) 73 | self.progressBar_2.setProperty("value", 5) 74 | self.progressBar_2.setTextVisible(False) 75 | self.progressBar_2.setInvertedAppearance(False) 76 | self.progressBar_2.setObjectName("progressBar_2") 77 | self.gridLayout.addWidget(self.progressBar_2, 3, 0, 1, 2) 78 | self.scrollArea.setWidget(self.scrollAreaWidgetContents) 79 | self.verticalLayout.addWidget(self.scrollArea) 80 | 81 | self.retranslateUi(Dialog) 82 | QtCore.QMetaObject.connectSlotsByName(Dialog) 83 | 84 | def retranslateUi(self, Dialog): 85 | _translate = QtCore.QCoreApplication.translate 86 | Dialog.setWindowTitle(_translate("Dialog", "Dialog")) 87 | self.label.setText(_translate("Dialog", "正在下载Java")) 88 | self.label_2.setText(_translate("Dialog", "下载Java")) 89 | self.label_3.setText(_translate("Dialog", "配置Java")) 90 | self.label_5.setText(_translate("Dialog", "0 MB/S - 正在准备下载")) 91 | self.pushButton.setText(_translate("Dialog", "取消")) 92 | -------------------------------------------------------------------------------- /UI/UI/Java_Dowmloader_UI.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | Dialog 4 | 5 | 6 | 7 | 0 8 | 0 9 | 568 10 | 255 11 | 12 | 13 | 14 | 15 | 568 16 | 255 17 | 18 | 19 | 20 | 21 | 568 22 | 255 23 | 24 | 25 | 26 | Dialog 27 | 28 | 29 | background-color: rgb(255, 255, 255); 30 | 31 | 32 | 33 | 34 | 35 | 正在下载Java 36 | 37 | 38 | 39 | 40 | 41 | 42 | QScrollArea{border-style:none;} 43 | QPushButton{border:2px solid rgba(235, 235, 235,0);height:25px;border-radius:5px;} 44 | QPushButton::hover{background-color: rgb(192, 192, 192);} 45 | QPushButton::pressed{background-color: rgb(169, 169, 169);} 46 | 47 | QProgressBar{ 48 | text-align: center;border-style:none;border-radius:5px;background-color: rgb(235, 235, 235);height:3px;color: rgb(66, 66, 66); 49 | } 50 | QProgressBar::chunk{ 51 | border-radius:5px; 52 | background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(64, 183, 255, 255), stop:1 rgba(67, 146, 255, 255)); 53 | } 54 | 55 | 56 | true 57 | 58 | 59 | 60 | 61 | 0 62 | 0 63 | 544 64 | 207 65 | 66 | 67 | 68 | 69 | 70 | 71 | 下载Java 72 | 73 | 74 | 75 | 76 | 77 | 78 | 配置Java 79 | 80 | 81 | 82 | 83 | 84 | 85 | Qt::Vertical 86 | 87 | 88 | 89 | 20 90 | 40 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 0 MB/S - 正在准备下载 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 0 107 | 0 108 | 109 | 110 | 111 | 112 | 150 113 | 30 114 | 115 | 116 | 117 | 118 | 150 119 | 30 120 | 121 | 122 | 123 | 取消 124 | 125 | 126 | 127 | 128 | 129 | 130 | 0 131 | 132 | 133 | 110 134 | 135 | 136 | 50 137 | 138 | 139 | false 140 | 141 | 142 | 143 | 144 | 145 | 146 | 5 147 | 148 | 149 | false 150 | 151 | 152 | false 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | -------------------------------------------------------------------------------- /UI/UI/MC_Dowmloader_OK_UI.py: -------------------------------------------------------------------------------- 1 | # Form implementation generated from reading ui file '/Users/xyj/.npm/ssh/UI/UI/MC_Dowmloader_OK_UI.ui' 2 | # 3 | # Created by: PyQt6 UI code generator 6.3.1 4 | # 5 | # WARNING: Any manual changes made to this file will be lost when pyuic6 is 6 | # run again. Do not edit this file unless you know what you are doing. 7 | 8 | 9 | from PyQt6 import QtCore, QtGui, QtWidgets 10 | 11 | 12 | class Ui_Dialog(object): 13 | def setupUi(self, Dialog): 14 | Dialog.setObjectName("Dialog") 15 | Dialog.resize(505, 120) 16 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Preferred, QtWidgets.QSizePolicy.Policy.Preferred) 17 | sizePolicy.setHorizontalStretch(0) 18 | sizePolicy.setVerticalStretch(120) 19 | sizePolicy.setHeightForWidth(Dialog.sizePolicy().hasHeightForWidth()) 20 | Dialog.setSizePolicy(sizePolicy) 21 | Dialog.setMinimumSize(QtCore.QSize(505, 120)) 22 | Dialog.setMaximumSize(QtCore.QSize(505, 120)) 23 | Dialog.setStyleSheet("QDialog{background-color: rgb(255, 255, 255);}\n" 24 | "#pushButton{border:2px solid rgba(235, 235, 235,0);height:25px;border-radius:5px;}\n" 25 | "#pushButton::hover{background-color: rgb(192, 192, 192);}\n" 26 | "#pushButton::pressed{background-color: rgb(169, 169, 169);}\n" 27 | "\n" 28 | "#pushButton_2{background-color: rgba(255, 255, 255, 0);}") 29 | self.gridLayout = QtWidgets.QGridLayout(Dialog) 30 | self.gridLayout.setObjectName("gridLayout") 31 | self.pushButton = QtWidgets.QPushButton(Dialog) 32 | self.pushButton.setMinimumSize(QtCore.QSize(200, 30)) 33 | self.pushButton.setMaximumSize(QtCore.QSize(200, 30)) 34 | self.pushButton.setStyleSheet("font-size: 14px;") 35 | self.pushButton.setObjectName("pushButton") 36 | self.gridLayout.addWidget(self.pushButton, 2, 3, 1, 1) 37 | self.pushButton_2 = QtWidgets.QPushButton(Dialog) 38 | self.pushButton_2.setMinimumSize(QtCore.QSize(50, 50)) 39 | self.pushButton_2.setMaximumSize(QtCore.QSize(50, 50)) 40 | self.pushButton_2.setText("") 41 | icon = QtGui.QIcon() 42 | icon.addPixmap(QtGui.QPixmap(":/ing/OK.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) 43 | self.pushButton_2.setIcon(icon) 44 | self.pushButton_2.setIconSize(QtCore.QSize(40, 40)) 45 | self.pushButton_2.setObjectName("pushButton_2") 46 | self.gridLayout.addWidget(self.pushButton_2, 0, 0, 2, 1) 47 | self.label = QtWidgets.QLabel(Dialog) 48 | self.label.setStyleSheet("font-size: 14px;") 49 | self.label.setObjectName("label") 50 | self.gridLayout.addWidget(self.label, 1, 1, 1, 3) 51 | self.label_2 = QtWidgets.QLabel(Dialog) 52 | self.label_2.setStyleSheet("font-size: 16px;") 53 | self.label_2.setIndent(2) 54 | self.label_2.setObjectName("label_2") 55 | self.gridLayout.addWidget(self.label_2, 0, 1, 1, 3) 56 | spacerItem = QtWidgets.QSpacerItem(254, 27, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) 57 | self.gridLayout.addItem(spacerItem, 2, 0, 1, 2) 58 | 59 | self.retranslateUi(Dialog) 60 | QtCore.QMetaObject.connectSlotsByName(Dialog) 61 | 62 | def retranslateUi(self, Dialog): 63 | _translate = QtCore.QCoreApplication.translate 64 | Dialog.setWindowTitle(_translate("Dialog", "Dialog")) 65 | self.pushButton.setText(_translate("Dialog", "好的")) 66 | self.label.setText(_translate("Dialog", "下载&配置游戏完成")) 67 | self.label_2.setText(_translate("Dialog", "提示")) 68 | -------------------------------------------------------------------------------- /UI/UI/MC_Dowmloader_OK_UI.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | Dialog 4 | 5 | 6 | 7 | 0 8 | 0 9 | 505 10 | 120 11 | 12 | 13 | 14 | 15 | 0 16 | 120 17 | 18 | 19 | 20 | 21 | 505 22 | 120 23 | 24 | 25 | 26 | 27 | 505 28 | 120 29 | 30 | 31 | 32 | Dialog 33 | 34 | 35 | QDialog{background-color: rgb(255, 255, 255);} 36 | #pushButton{border:2px solid rgba(235, 235, 235,0);height:25px;border-radius:5px;} 37 | #pushButton::hover{background-color: rgb(192, 192, 192);} 38 | #pushButton::pressed{background-color: rgb(169, 169, 169);} 39 | 40 | #pushButton_2{background-color: rgba(255, 255, 255, 0);} 41 | 42 | 43 | 44 | 45 | 46 | 47 | 200 48 | 30 49 | 50 | 51 | 52 | 53 | 200 54 | 30 55 | 56 | 57 | 58 | font-size: 14px; 59 | 60 | 61 | 好的 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 50 70 | 50 71 | 72 | 73 | 74 | 75 | 50 76 | 50 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | :/ing/OK.png:/ing/OK.png 85 | 86 | 87 | 88 | 40 89 | 40 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | font-size: 14px; 98 | 99 | 100 | 下载&配置游戏完成 101 | 102 | 103 | 104 | 105 | 106 | 107 | font-size: 16px; 108 | 109 | 110 | 提示 111 | 112 | 113 | 0 114 | 115 | 116 | 2 117 | 118 | 119 | 120 | 121 | 122 | 123 | Qt::Horizontal 124 | 125 | 126 | 127 | 254 128 | 27 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | -------------------------------------------------------------------------------- /UI/UI/MC_Dowmloader_UI.py: -------------------------------------------------------------------------------- 1 | # Form implementation generated from reading ui file '/Users/xyj/.npm/ssh/UI/UI/MC_Dowmloader_UI.ui' 2 | # 3 | # Created by: PyQt6 UI code generator 6.3.1 4 | # 5 | # WARNING: Any manual changes made to this file will be lost when pyuic6 is 6 | # run again. Do not edit this file unless you know what you are doing. 7 | 8 | 9 | from PyQt6 import QtCore, QtGui, QtWidgets 10 | 11 | 12 | class Ui_MOS_D_MC_Dialog(object): 13 | def setupUi(self, MOS_D_MC_Dialog): 14 | MOS_D_MC_Dialog.setObjectName("MOS_D_MC_Dialog") 15 | MOS_D_MC_Dialog.resize(560, 245) 16 | MOS_D_MC_Dialog.setMinimumSize(QtCore.QSize(560, 245)) 17 | MOS_D_MC_Dialog.setMaximumSize(QtCore.QSize(560, 245)) 18 | MOS_D_MC_Dialog.setStyleSheet("QDialog{background-color: rgb(255, 255, 255);}\n" 19 | "\n" 20 | "QScrollArea{border-style:none;}\n" 21 | "QPushButton{border:2px solid rgba(235, 235, 235,0);height:25px;border-radius:5px;}\n" 22 | "QPushButton::hover{background-color: rgb(192, 192, 192);}\n" 23 | "QPushButton::pressed{background-color: rgb(169, 169, 169);}") 24 | self.gridLayout = QtWidgets.QGridLayout(MOS_D_MC_Dialog) 25 | self.gridLayout.setContentsMargins(12, 12, 12, 12) 26 | self.gridLayout.setObjectName("gridLayout") 27 | self.label = QtWidgets.QLabel(MOS_D_MC_Dialog) 28 | self.label.setObjectName("label") 29 | self.gridLayout.addWidget(self.label, 0, 0, 1, 1) 30 | self.scrollArea = QtWidgets.QScrollArea(MOS_D_MC_Dialog) 31 | self.scrollArea.setStyleSheet("QScrollArea{border-style:none;background-color: rgba(255, 255, 255, 0);}\n" 32 | "QPushButton{border:2px solid rgba(235, 235, 235,0);height:25px;border-radius:5px;}\n" 33 | "QPushButton::hover{background-color: rgb(192, 192, 192);}\n" 34 | "QPushButton::pressed{background-color: rgb(169, 169, 169);}\n" 35 | "\n" 36 | "QProgressBar{\n" 37 | " text-align: center;border-style:none;border-radius:5px;background-color: rgb(235, 235, 235);height:3px;color: rgb(66, 66, 66);\n" 38 | "}\n" 39 | "QProgressBar::chunk{\n" 40 | " border-radius:5px;\n" 41 | " background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(64, 183, 255, 255), stop:1 rgba(67, 146, 255, 255));\n" 42 | "}\n" 43 | "\n" 44 | "QScrollArea{border-style:none;background-color: rgba(255, 255, 255, 0);}\n" 45 | "/*设置垂直滚动条基本样式*/\n" 46 | "QScrollBar:vertical\n" 47 | "{\n" 48 | " width:8px;\n" 49 | " background:rgba(0,0,0,0%);\n" 50 | " margin:0px,0px,0px,0px;\n" 51 | " padding-top:9px; /*留出9px给上面和下面的箭头*/\n" 52 | " padding-bottom:9px;\n" 53 | "}\n" 54 | "QScrollBar::handle:vertical\n" 55 | "{\n" 56 | " width:8px;\n" 57 | " background: rgb(214, 214, 214);\n" 58 | " border-radius:3px; /*滚动条两端变成椭圆*/\n" 59 | " min-height:;\n" 60 | "}\n" 61 | "QScrollBar::handle:vertical:hover\n" 62 | "{\n" 63 | " width:8px;\n" 64 | " background:rgb(192, 192, 192); /* 鼠标放到滚动条上的时候,颜色变深*/\n" 65 | " border-radius:4px;\n" 66 | " min-height:;\n" 67 | "}\n" 68 | "QScrollBar::add-line:vertical /*这个应该是设置下箭头的,3.png就是箭头*/\n" 69 | "{\n" 70 | " height:9px;width:8px;\n" 71 | " border-image:url(:/img/picture/caret-down_1.png);\n" 72 | " subcontrol-position:bottom;\n" 73 | "}\n" 74 | "QScrollBar::sub-line:vertical /*设置上箭头*/\n" 75 | "{\n" 76 | " height:9px;width:8px;\n" 77 | " border-image:url(:/img/picture/caret-up_1.png);\n" 78 | " subcontrol-position:top;\n" 79 | "}\n" 80 | "QScrollBar::add-line:vertical:hover /*当鼠标放到下箭头上的时候*/\n" 81 | "{\n" 82 | " height:9px;width:8px;\n" 83 | " border-image:url(:/img/picture/caret-down.png);\n" 84 | " subcontrol-position:bottom;\n" 85 | "}\n" 86 | "QScrollBar::sub-line:vertical:hover /*当鼠标放到下箭头上的时候*/\n" 87 | "{\n" 88 | " height:9px;width:8px;\n" 89 | " border-image:url(:/img/picture/caret-up.png);\n" 90 | " subcontrol-position:top;\n" 91 | "}\n" 92 | "QScrollBar::sub-page:vertical,QScrollBar::add-page:vertical /*当滚动条滚动的时候,上面的部分和下面的部分*/\n" 93 | "{\n" 94 | " background: rgba(235, 235, 235,150);\n" 95 | " border-radius:4px;\n" 96 | "}\n" 97 | "QScrollBar::add-page:vertical,QScrollBar::sub-page:vertical /*当滚动条滚动的时候,上面的部分和下面的部分*/\n" 98 | "{\n" 99 | " background: rgba(235, 235, 235,150);\n" 100 | " border-radius:4px;\n" 101 | "}") 102 | self.scrollArea.setLineWidth(1) 103 | self.scrollArea.setWidgetResizable(True) 104 | self.scrollArea.setObjectName("scrollArea") 105 | self.scrollAreaWidgetContents = QtWidgets.QWidget() 106 | self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 536, 222)) 107 | self.scrollAreaWidgetContents.setStyleSheet("background-color: rgba(255, 255, 255, 0);") 108 | self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents") 109 | self.verticalLayout = QtWidgets.QVBoxLayout(self.scrollAreaWidgetContents) 110 | self.verticalLayout.setObjectName("verticalLayout") 111 | self.label_2 = QtWidgets.QLabel(self.scrollAreaWidgetContents) 112 | self.label_2.setObjectName("label_2") 113 | self.verticalLayout.addWidget(self.label_2) 114 | self.progressBar = QtWidgets.QProgressBar(self.scrollAreaWidgetContents) 115 | self.progressBar.setMinimum(0) 116 | self.progressBar.setMaximum(105) 117 | self.progressBar.setProperty("value", 0) 118 | self.progressBar.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) 119 | self.progressBar.setTextVisible(True) 120 | self.progressBar.setObjectName("progressBar") 121 | self.verticalLayout.addWidget(self.progressBar) 122 | self.label_3 = QtWidgets.QLabel(self.scrollAreaWidgetContents) 123 | self.label_3.setObjectName("label_3") 124 | self.verticalLayout.addWidget(self.label_3) 125 | self.progressBar_2 = QtWidgets.QProgressBar(self.scrollAreaWidgetContents) 126 | self.progressBar_2.setMaximum(0) 127 | self.progressBar_2.setProperty("value", 0) 128 | self.progressBar_2.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) 129 | self.progressBar_2.setTextVisible(True) 130 | self.progressBar_2.setInvertedAppearance(False) 131 | self.progressBar_2.setObjectName("progressBar_2") 132 | self.verticalLayout.addWidget(self.progressBar_2) 133 | self.label_6 = QtWidgets.QLabel(self.scrollAreaWidgetContents) 134 | self.label_6.setObjectName("label_6") 135 | self.verticalLayout.addWidget(self.label_6) 136 | self.progressBar_4 = QtWidgets.QProgressBar(self.scrollAreaWidgetContents) 137 | self.progressBar_4.setMaximum(0) 138 | self.progressBar_4.setProperty("value", 0) 139 | self.progressBar_4.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) 140 | self.progressBar_4.setTextVisible(False) 141 | self.progressBar_4.setInvertedAppearance(False) 142 | self.progressBar_4.setObjectName("progressBar_4") 143 | self.verticalLayout.addWidget(self.progressBar_4) 144 | self.label_4 = QtWidgets.QLabel(self.scrollAreaWidgetContents) 145 | self.label_4.setObjectName("label_4") 146 | self.verticalLayout.addWidget(self.label_4) 147 | self.progressBar_3 = QtWidgets.QProgressBar(self.scrollAreaWidgetContents) 148 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Fixed) 149 | sizePolicy.setHorizontalStretch(0) 150 | sizePolicy.setVerticalStretch(0) 151 | sizePolicy.setHeightForWidth(self.progressBar_3.sizePolicy().hasHeightForWidth()) 152 | self.progressBar_3.setSizePolicy(sizePolicy) 153 | self.progressBar_3.setMaximum(0) 154 | self.progressBar_3.setProperty("value", 0) 155 | self.progressBar_3.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) 156 | self.progressBar_3.setTextVisible(True) 157 | self.progressBar_3.setInvertedAppearance(False) 158 | self.progressBar_3.setObjectName("progressBar_3") 159 | self.verticalLayout.addWidget(self.progressBar_3) 160 | self.scrollArea.setWidget(self.scrollAreaWidgetContents) 161 | self.gridLayout.addWidget(self.scrollArea, 1, 0, 2, 2) 162 | self.label_5 = QtWidgets.QLabel(MOS_D_MC_Dialog) 163 | self.label_5.setObjectName("label_5") 164 | self.gridLayout.addWidget(self.label_5, 3, 0, 1, 1) 165 | self.pushButton = QtWidgets.QPushButton(MOS_D_MC_Dialog) 166 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Fixed) 167 | sizePolicy.setHorizontalStretch(0) 168 | sizePolicy.setVerticalStretch(0) 169 | sizePolicy.setHeightForWidth(self.pushButton.sizePolicy().hasHeightForWidth()) 170 | self.pushButton.setSizePolicy(sizePolicy) 171 | self.pushButton.setMinimumSize(QtCore.QSize(150, 30)) 172 | self.pushButton.setMaximumSize(QtCore.QSize(150, 30)) 173 | self.pushButton.setObjectName("pushButton") 174 | self.gridLayout.addWidget(self.pushButton, 3, 1, 1, 1) 175 | 176 | self.retranslateUi(MOS_D_MC_Dialog) 177 | QtCore.QMetaObject.connectSlotsByName(MOS_D_MC_Dialog) 178 | 179 | def retranslateUi(self, MOS_D_MC_Dialog): 180 | _translate = QtCore.QCoreApplication.translate 181 | MOS_D_MC_Dialog.setWindowTitle(_translate("MOS_D_MC_Dialog", "Dialog")) 182 | self.label.setText(_translate("MOS_D_MC_Dialog", "安装游戏")) 183 | self.label_2.setText(_translate("MOS_D_MC_Dialog", "下载主文件")) 184 | self.label_3.setText(_translate("MOS_D_MC_Dialog", "下载资源库文件")) 185 | self.progressBar_2.setFormat(_translate("MOS_D_MC_Dialog", "%v/%m")) 186 | self.label_6.setText(_translate("MOS_D_MC_Dialog", "下载依赖库文件")) 187 | self.progressBar_4.setFormat(_translate("MOS_D_MC_Dialog", "%v/%m")) 188 | self.label_4.setText(_translate("MOS_D_MC_Dialog", "安装游戏")) 189 | self.progressBar_3.setFormat(_translate("MOS_D_MC_Dialog", "%p%")) 190 | self.label_5.setText(_translate("MOS_D_MC_Dialog", "0 MB/S - 正在准备下载")) 191 | self.pushButton.setText(_translate("MOS_D_MC_Dialog", "取消")) 192 | -------------------------------------------------------------------------------- /UI/UI/MC_Dowmloader_UI.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | MOS_D_MC_Dialog 4 | 5 | 6 | 7 | 0 8 | 0 9 | 560 10 | 245 11 | 12 | 13 | 14 | 15 | 560 16 | 245 17 | 18 | 19 | 20 | 21 | 560 22 | 245 23 | 24 | 25 | 26 | Dialog 27 | 28 | 29 | QDialog{background-color: rgb(255, 255, 255);} 30 | 31 | QScrollArea{border-style:none;} 32 | QPushButton{border:2px solid rgba(235, 235, 235,0);height:25px;border-radius:5px;} 33 | QPushButton::hover{background-color: rgb(192, 192, 192);} 34 | QPushButton::pressed{background-color: rgb(169, 169, 169);} 35 | 36 | 37 | 38 | 12 39 | 40 | 41 | 12 42 | 43 | 44 | 12 45 | 46 | 47 | 12 48 | 49 | 50 | 51 | 52 | 安装游戏 53 | 54 | 55 | 56 | 57 | 58 | 59 | QScrollArea{border-style:none;background-color: rgba(255, 255, 255, 0);} 60 | QPushButton{border:2px solid rgba(235, 235, 235,0);height:25px;border-radius:5px;} 61 | QPushButton::hover{background-color: rgb(192, 192, 192);} 62 | QPushButton::pressed{background-color: rgb(169, 169, 169);} 63 | 64 | QProgressBar{ 65 | text-align: center;border-style:none;border-radius:5px;background-color: rgb(235, 235, 235);height:3px;color: rgb(66, 66, 66); 66 | } 67 | QProgressBar::chunk{ 68 | border-radius:5px; 69 | background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(64, 183, 255, 255), stop:1 rgba(67, 146, 255, 255)); 70 | } 71 | 72 | QScrollArea{border-style:none;background-color: rgba(255, 255, 255, 0);} 73 | /*设置垂直滚动条基本样式*/ 74 | QScrollBar:vertical 75 | { 76 | width:8px; 77 | background:rgba(0,0,0,0%); 78 | margin:0px,0px,0px,0px; 79 | padding-top:9px; /*留出9px给上面和下面的箭头*/ 80 | padding-bottom:9px; 81 | } 82 | QScrollBar::handle:vertical 83 | { 84 | width:8px; 85 | background: rgb(214, 214, 214); 86 | border-radius:3px; /*滚动条两端变成椭圆*/ 87 | min-height:; 88 | } 89 | QScrollBar::handle:vertical:hover 90 | { 91 | width:8px; 92 | background:rgb(192, 192, 192); /* 鼠标放到滚动条上的时候,颜色变深*/ 93 | border-radius:4px; 94 | min-height:; 95 | } 96 | QScrollBar::add-line:vertical /*这个应该是设置下箭头的,3.png就是箭头*/ 97 | { 98 | height:9px;width:8px; 99 | border-image:url(:/img/picture/caret-down_1.png); 100 | subcontrol-position:bottom; 101 | } 102 | QScrollBar::sub-line:vertical /*设置上箭头*/ 103 | { 104 | height:9px;width:8px; 105 | border-image:url(:/img/picture/caret-up_1.png); 106 | subcontrol-position:top; 107 | } 108 | QScrollBar::add-line:vertical:hover /*当鼠标放到下箭头上的时候*/ 109 | { 110 | height:9px;width:8px; 111 | border-image:url(:/img/picture/caret-down.png); 112 | subcontrol-position:bottom; 113 | } 114 | QScrollBar::sub-line:vertical:hover /*当鼠标放到下箭头上的时候*/ 115 | { 116 | height:9px;width:8px; 117 | border-image:url(:/img/picture/caret-up.png); 118 | subcontrol-position:top; 119 | } 120 | QScrollBar::sub-page:vertical,QScrollBar::add-page:vertical /*当滚动条滚动的时候,上面的部分和下面的部分*/ 121 | { 122 | background: rgba(235, 235, 235,150); 123 | border-radius:4px; 124 | } 125 | QScrollBar::add-page:vertical,QScrollBar::sub-page:vertical /*当滚动条滚动的时候,上面的部分和下面的部分*/ 126 | { 127 | background: rgba(235, 235, 235,150); 128 | border-radius:4px; 129 | } 130 | 131 | 132 | 1 133 | 134 | 135 | true 136 | 137 | 138 | 139 | 140 | 0 141 | 0 142 | 536 143 | 222 144 | 145 | 146 | 147 | background-color: rgba(255, 255, 255, 0); 148 | 149 | 150 | 151 | 152 | 153 | 下载主文件 154 | 155 | 156 | 157 | 158 | 159 | 160 | 0 161 | 162 | 163 | 105 164 | 165 | 166 | 0 167 | 168 | 169 | Qt::AlignCenter 170 | 171 | 172 | true 173 | 174 | 175 | 176 | 177 | 178 | 179 | 下载资源库文件 180 | 181 | 182 | 183 | 184 | 185 | 186 | 0 187 | 188 | 189 | 0 190 | 191 | 192 | Qt::AlignCenter 193 | 194 | 195 | true 196 | 197 | 198 | false 199 | 200 | 201 | %v/%m 202 | 203 | 204 | 205 | 206 | 207 | 208 | 下载依赖库文件 209 | 210 | 211 | 212 | 213 | 214 | 215 | 0 216 | 217 | 218 | 0 219 | 220 | 221 | Qt::AlignCenter 222 | 223 | 224 | true 225 | 226 | 227 | false 228 | 229 | 230 | %v/%m 231 | 232 | 233 | 234 | 235 | 236 | 237 | 安装游戏 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 0 246 | 0 247 | 248 | 249 | 250 | 0 251 | 252 | 253 | 0 254 | 255 | 256 | Qt::AlignCenter 257 | 258 | 259 | true 260 | 261 | 262 | false 263 | 264 | 265 | %p% 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 0 MB/S - 正在准备下载 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 0 285 | 0 286 | 287 | 288 | 289 | 290 | 150 291 | 30 292 | 293 | 294 | 295 | 296 | 150 297 | 30 298 | 299 | 300 | 301 | 取消 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | -------------------------------------------------------------------------------- /UI/UI/MOS_start_loading.py: -------------------------------------------------------------------------------- 1 | # Form implementation generated from reading ui file '/Users/xyj/.npm/ssh/UI/UI/MOS_start_loading.ui' 2 | # 3 | # Created by: PyQt6 UI code generator 6.3.1 4 | # 5 | # WARNING: Any manual changes made to this file will be lost when pyuic6 is 6 | # run again. Do not edit this file unless you know what you are doing. 7 | 8 | 9 | from PyQt6 import QtCore, QtGui, QtWidgets 10 | 11 | 12 | class Ui_MainWindow(object): 13 | def setupUi(self, MainWindow): 14 | MainWindow.setObjectName("MainWindow") 15 | MainWindow.setEnabled(True) 16 | MainWindow.resize(175, 175) 17 | MainWindow.setMinimumSize(QtCore.QSize(175, 175)) 18 | MainWindow.setMaximumSize(QtCore.QSize(175, 175)) 19 | MainWindow.setCursor(QtGui.QCursor(QtCore.Qt.CursorShape.WaitCursor)) 20 | MainWindow.setMouseTracking(True) 21 | MainWindow.setWindowOpacity(1.0) 22 | MainWindow.setToolTipDuration(0) 23 | MainWindow.setStyleSheet("") 24 | MainWindow.setIconSize(QtCore.QSize(100, 100)) 25 | MainWindow.setTabShape(QtWidgets.QTabWidget.TabShape.Rounded) 26 | MainWindow.setDockOptions(QtWidgets.QMainWindow.AllowTabbedDocks|QtWidgets.QMainWindow.AnimatedDocks) 27 | MainWindow.setUnifiedTitleAndToolBarOnMac(False) 28 | self.centralwidget = QtWidgets.QWidget(MainWindow) 29 | self.centralwidget.setObjectName("centralwidget") 30 | self.gridLayout = QtWidgets.QGridLayout(self.centralwidget) 31 | self.gridLayout.setContentsMargins(0, 0, 0, 0) 32 | self.gridLayout.setSpacing(0) 33 | self.gridLayout.setObjectName("gridLayout") 34 | self.label = QtWidgets.QLabel(self.centralwidget) 35 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Preferred, QtWidgets.QSizePolicy.Policy.Preferred) 36 | sizePolicy.setHorizontalStretch(0) 37 | sizePolicy.setVerticalStretch(0) 38 | sizePolicy.setHeightForWidth(self.label.sizePolicy().hasHeightForWidth()) 39 | self.label.setSizePolicy(sizePolicy) 40 | self.label.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) 41 | self.label.setStyleSheet("border-image: url(:/img/ico.png);") 42 | self.label.setObjectName("label") 43 | self.gridLayout.addWidget(self.label, 0, 0, 1, 1) 44 | MainWindow.setCentralWidget(self.centralwidget) 45 | 46 | self.retranslateUi(MainWindow) 47 | QtCore.QMetaObject.connectSlotsByName(MainWindow) 48 | 49 | def retranslateUi(self, MainWindow): 50 | _translate = QtCore.QCoreApplication.translate 51 | MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) 52 | self.label.setText(_translate("MainWindow", "


")) 53 | -------------------------------------------------------------------------------- /UI/UI/MOS_start_loading.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | MainWindow 4 | 5 | 6 | true 7 | 8 | 9 | 10 | 0 11 | 0 12 | 175 13 | 175 14 | 15 | 16 | 17 | 18 | 175 19 | 175 20 | 21 | 22 | 23 | 24 | 175 25 | 175 26 | 27 | 28 | 29 | WaitCursor 30 | 31 | 32 | true 33 | 34 | 35 | MainWindow 36 | 37 | 38 | 1.000000000000000 39 | 40 | 41 | 0 42 | 43 | 44 | 45 | 46 | 47 | 48 | 100 49 | 100 50 | 51 | 52 | 53 | QTabWidget::Rounded 54 | 55 | 56 | QMainWindow::AllowTabbedDocks|QMainWindow::AnimatedDocks 57 | 58 | 59 | false 60 | 61 | 62 | 63 | 64 | 0 65 | 66 | 67 | 0 68 | 69 | 70 | 0 71 | 72 | 73 | 0 74 | 75 | 76 | 0 77 | 78 | 79 | 80 | 81 | 82 | 0 83 | 0 84 | 85 | 86 | 87 | Qt::NoFocus 88 | 89 | 90 | border-image: url(:/img/ico.png); 91 | 92 | 93 | <html><head/><body><p><br/></p></body></html> 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | -------------------------------------------------------------------------------- /UI/qrc/Java_Dowmloader.qrc: -------------------------------------------------------------------------------- 1 | 2 | 3 | OK.png 4 | 5 | 6 | -------------------------------------------------------------------------------- /UI/qrc/MOS.qrc: -------------------------------------------------------------------------------- 1 | 2 | 3 | caret-down_1.png 4 | hide.png 5 | close.png 6 | caret-down.png 7 | caret-up.png 8 | caret-up_1.png 9 | loading_3.gif 10 | back_blue_down.png 11 | back_blue_up.png 12 | 13 | 14 | -------------------------------------------------------------------------------- /UI/qrc/MOS_start_loading.qrc: -------------------------------------------------------------------------------- 1 | 2 | 3 | ico.png 4 | 5 | 6 | -------------------------------------------------------------------------------- /UI/qrc/OK.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/UI/qrc/OK.png -------------------------------------------------------------------------------- /UI/qrc/back_blue_down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/UI/qrc/back_blue_down.png -------------------------------------------------------------------------------- /UI/qrc/back_blue_up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/UI/qrc/back_blue_up.png -------------------------------------------------------------------------------- /UI/qrc/caret-down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/UI/qrc/caret-down.png -------------------------------------------------------------------------------- /UI/qrc/caret-down_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/UI/qrc/caret-down_1.png -------------------------------------------------------------------------------- /UI/qrc/caret-up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/UI/qrc/caret-up.png -------------------------------------------------------------------------------- /UI/qrc/caret-up_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/UI/qrc/caret-up_1.png -------------------------------------------------------------------------------- /UI/qrc/close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/UI/qrc/close.png -------------------------------------------------------------------------------- /UI/qrc/hide.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/UI/qrc/hide.png -------------------------------------------------------------------------------- /UI/qrc/ico.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/UI/qrc/ico.png -------------------------------------------------------------------------------- /UI/qrc/loading_3.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/UI/qrc/loading_3.gif -------------------------------------------------------------------------------- /html/MOS.htmlm: -------------------------------------------------------------------------------- 1 | 2 |

我的世界MOS启动器公告

3 | 10 | -------------------------------------------------------------------------------- /html/MOS原.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |   5 | 我的世界MOS启动器公告  6 | 7 | 8 |

我的世界MOS启动器公告

9 |

欢迎您使用MOS启动器

10 | 17 | 18 | -------------------------------------------------------------------------------- /html/versions.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |

[#]修复了HeimNad反馈的Bug

4 |

[+]增加了“点击游戏目录中某一目录时,加载当前目录下的版本”功能

5 |

[+]增加了“添加游戏文件夹”功能

6 |

[+]Ui更新 注:太多了 不一一列举

7 | 8 | -------------------------------------------------------------------------------- /librarys/forge-install-bootstrapper.jar-mos: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/librarys/forge-install-bootstrapper.jar-mos -------------------------------------------------------------------------------- /picture/MOS_loading_start.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/MOS_loading_start.png -------------------------------------------------------------------------------- /picture/OK.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/OK.png -------------------------------------------------------------------------------- /picture/SkyWorldStudio.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/SkyWorldStudio.png -------------------------------------------------------------------------------- /picture/about.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/about.png -------------------------------------------------------------------------------- /picture/add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/add.png -------------------------------------------------------------------------------- /picture/back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/back.png -------------------------------------------------------------------------------- /picture/back_blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/back_blue.png -------------------------------------------------------------------------------- /picture/back_blue_down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/back_blue_down.png -------------------------------------------------------------------------------- /picture/back_blue_up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/back_blue_up.png -------------------------------------------------------------------------------- /picture/back_down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/back_down.png -------------------------------------------------------------------------------- /picture/back_up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/back_up.png -------------------------------------------------------------------------------- /picture/caret-down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/caret-down.png -------------------------------------------------------------------------------- /picture/caret-down_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/caret-down_1.png -------------------------------------------------------------------------------- /picture/caret-up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/caret-up.png -------------------------------------------------------------------------------- /picture/caret-up_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/caret-up_1.png -------------------------------------------------------------------------------- /picture/close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/close.png -------------------------------------------------------------------------------- /picture/david.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/david.png -------------------------------------------------------------------------------- /picture/download.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/download.png -------------------------------------------------------------------------------- /picture/fabric.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/fabric.png -------------------------------------------------------------------------------- /picture/false.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/false.png -------------------------------------------------------------------------------- /picture/folder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/folder.png -------------------------------------------------------------------------------- /picture/folder_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/folder_add.png -------------------------------------------------------------------------------- /picture/folder_minus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/folder_minus.png -------------------------------------------------------------------------------- /picture/folder_open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/folder_open.png -------------------------------------------------------------------------------- /picture/forge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/forge.png -------------------------------------------------------------------------------- /picture/grass.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/grass.png -------------------------------------------------------------------------------- /picture/heimnad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/heimnad.png -------------------------------------------------------------------------------- /picture/hide.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/hide.png -------------------------------------------------------------------------------- /picture/home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/home.png -------------------------------------------------------------------------------- /picture/ico.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/ico.icns -------------------------------------------------------------------------------- /picture/ico.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/ico.png -------------------------------------------------------------------------------- /picture/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/loading.gif -------------------------------------------------------------------------------- /picture/loading_2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/loading_2.gif -------------------------------------------------------------------------------- /picture/loading_2_black.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/loading_2_black.gif -------------------------------------------------------------------------------- /picture/loading_3.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/loading_3.gif -------------------------------------------------------------------------------- /picture/loading_3_black.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/loading_3_black.gif -------------------------------------------------------------------------------- /picture/loading_black.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/loading_black.gif -------------------------------------------------------------------------------- /picture/minecraft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/minecraft.png -------------------------------------------------------------------------------- /picture/music.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/music.png -------------------------------------------------------------------------------- /picture/online.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/online.png -------------------------------------------------------------------------------- /picture/online_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/online_2.png -------------------------------------------------------------------------------- /picture/optifine.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/optifine.png -------------------------------------------------------------------------------- /picture/quilt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/quilt.png -------------------------------------------------------------------------------- /picture/return.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/return.png -------------------------------------------------------------------------------- /picture/settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/settings.png -------------------------------------------------------------------------------- /picture/trash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/trash.png -------------------------------------------------------------------------------- /picture/trash_red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/trash_red.png -------------------------------------------------------------------------------- /picture/user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/user.png -------------------------------------------------------------------------------- /picture/user_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/user_add.png -------------------------------------------------------------------------------- /picture/user_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/user_delete.png -------------------------------------------------------------------------------- /picture/white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/white.png -------------------------------------------------------------------------------- /picture/yes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/David-xian66/Minecraft-Optimal-Starter_2/04304d2e4bee4d56780d1bb88bf943f54d190c1d/picture/yes.png --------------------------------------------------------------------------------