├── .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 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/.idea/dictionaries/xyj.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/.idea/git_toolbox_prj.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/.idea/inspectionProfiles/profiles_settings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/.idea/jsonSchemas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
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 | [](https://www.oscs1024.com/project/xianyongjian080402/Minecraft-Optimal-Starter_2?ref=badge_small)
13 | [](https://gitee.com/xian66/minecraft-optimal-starter_2/stargazers)
14 | [](https://gitee.com/xian66/minecraft-optimal-starter_2/members)
15 | [](https://github.com/xianyongjian080402/Minecraft-Optimal-Starter_2/issues)
16 | [](https://github.com/xianyongjian080402/Minecraft-Optimal-Starter_2/stargazers)
17 | [](https://github.com/xianyongjian080402/Minecraft-Optimal-Starter_2/blob/master/LICENSE)
18 | [](https://github.com/xianyongjian080402/Minecraft-Optimal-Starter_2/network)
19 | 
20 | 
21 | 
22 |
23 | [](https://gitee.com/xian66/minecraft-optimal-starter_2)
24 |
25 | [](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 |
4 | ——公告——
5 |
6 | 启动器正在全力开发中 还请您耐心等待
7 | 由于我还要上学 所以开发进度会慢一些 还请您谅解
8 |
9 |
10 |
--------------------------------------------------------------------------------
/html/MOS原.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 我的世界MOS启动器公告
6 |
7 |
8 | 我的世界MOS启动器公告
9 | 欢迎您使用MOS启动器
10 |
11 | - ——公告——
12 |
13 | - 启动器正在全力开发中 还请您耐心等待
14 | - 由于我还要上学 所以开发进度会慢一些 还请您谅解
15 |
16 |
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
--------------------------------------------------------------------------------