开始
有一天我网上冲浪看到了一篇博客,说的是用python做mc启动器,我就想我能不能也做一个
主要用的库是minecraft_launcher_lib
GUI是用的PyQt5
不大会做GUI...尽力了,有没有大佬给帮忙改改
话不多说,上代码
代码
launcher.py
from datetime import datetime
import pyqt5_tools
import PyQt5
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QIcon, QFont, QPalette
from PyQt5.QtWidgets import QApplication, QWidget, QDesktopWidget, QLabel, QLineEdit, QPushButton, QListWidget, \
QMessageBox, QComboBox
from pyqt5_plugins.examplebutton import QtWidgets
import main
import minecraft_launcher_lib
import os
minecraft_dir = ".minecraft"
minecraft_version = ""
minecraft_JVM = "2048m"
minecraft_JavaPath = ""
launcher_name = "Minecraft Python Launcher"
launcher_version = "0.1"
class Ui_launcher(QWidget):
def __init__(self):
super().__init__()
def initUI(self):
# 窗口
self.setGeometry(0, 0, 600, 400)
self.setWindowTitle("Minecraft Python Launcher")
self.setWindowIcon(QIcon('icon.ico'))
self.show()
# 居中
self.center()
# 文本 启动器标题
self.title = QLabel(self)
self.title.setGeometry(20, 0, 300, 60)
self.title.setText("Minecraft Python Launcher")
self.title.setVisible(True)
self.title.setFont(QFont("等线 Light", 20, QFont.Light))
self.title.setStyleSheet("color: black") # 更改颜色
# 文本 “玩家名:”
self.Player_name_label = QLabel(self)
self.Player_name_label.setGeometry(50, 125, 50, 20)
self.Player_name_label.setText("玩家名:")
self.Player_name_label.setVisible(True)
# 输入玩家名
self.Player_name = QLineEdit(self)
self.Player_name.setGeometry(50, 150, 230, 30)
self.Player_name.setFont(QFont("等线 Light", 10))
self.Player_name.setVisible(True)
# MC,起洞!
self.StartGameButton = QPushButton(self)
self.StartGameButton.setText(" MC 启动!")
self.StartGameButton.setFont(QFont("等线 Light", 20, QFont.Bold))
self.StartGameButton.setVisible(True)
self.StartGameButton.setGeometry(50, 200, 230, 60)
self.StartGameButton.clicked.connect(self.StartGameButtonClicked)
# 已安装的版本列表按钮
self.InstalledListButton = QPushButton(self)
self.InstalledListButton.setText("版本列表")
self.InstalledListButton.setGeometry(50, 265, 230, 30)
self.InstalledListButton.setVisible(True)
self.InstalledListButton.clicked.connect(self.InstalledVersionListButtonClicked)
# 已安装的版本列表
self.VersionsList = QListWidget(self)
self.VersionsList.setGeometry(340, 40, 250, 340)
self.VersionsList.setVisible(True)
# 版本下载按钮
self.DownloadButton = QPushButton(self)
self.DownloadButton.setGeometry(50, 300, 230, 30)
self.DownloadButton.setText("版本下载")
self.DownloadButton.setVisible(True)
self.DownloadButton.clicked.connect(self.DownloadVersionsButtonClicked)
# 下载按钮
self.DownloadVersionButton = QPushButton(self)
self.DownloadVersionButton.setGeometry(340, 10, 250, 30)
self.DownloadVersionButton.setText("下载该版本")
self.DownloadVersionButton.clicked.connect(self.DownloadButtonClicked)
# 版本设置
self.SettingButton = QPushButton(self)
self.SettingButton.setText("版本设置")
self.SettingButton.setGeometry(50, 335, 230, 30)
self.SettingButton.setVisible(True)
self.SettingButton.clicked.connect(self.SettingButtonClicked)
# 版本设置页:
# 返回按钮
self.BackButton = QPushButton(self)
self.BackButton.setText("返回")
self.BackButton.setGeometry(520, 10, 80, 30)
self.BackButton.clicked.connect(self.BackButtonClick)
# 文本 设置
self.SettingLabel = QLabel(self)
self.SettingLabel.setText("设置")
self.SettingLabel.setFont(QFont("等线 Light", 28, QFont.Light))
self.SettingLabel.setGeometry(0, 0, 100, 50)
# 文本 Java选择
self.JavaLabel = QLabel(self)
self.JavaLabel.setText("选择java")
self.JavaLabel.setGeometry(20, 50, 100, 30)
# Java下拉列表
self.JavaList = QComboBox(self)
self.findJava()
self.JavaList.setGeometry(20, 75, 260, 20)
# Java按钮
self.JavaButton = QPushButton(self)
self.JavaButton.setText("确定")
self.JavaButton.setGeometry(210, 100, 70, 20)
self.JavaButton.clicked.connect(self.JavaButtonClick)
def center(self):
qr = self.frameGeometry()
cp = QDesktopWidget().availableGeometry().center()
qr.moveCenter(cp)
self.move(qr.topLeft())
def StartGameButtonClicked(self):
self.DownloadVersionButton.setVisible(False)
try:
minecraft_version = self.VersionsList.selectedItems()[0].text()
except:
minecraft_version = None
print(minecraft_version, minecraft_dir, minecraft_JVM, self.Player_name.text(), minecraft_JavaPath)
def playername_(self):
reply = QMessageBox.warning(self, '警告', "玩家名不能为空", QMessageBox.Yes)
if self.Player_name.text() == "":
playername_(self)
else:
def version_(self):
reply = QMessageBox.warning(self, '警告', "未选择版本,可点击版本列表选择版本", QMessageBox.Yes)
if minecraft_version is None:
version_(self)
else:
def JavaPath_(self):
reply = QMessageBox.warning(self, '警告', "未选择Java,可点击版本设置选择Java", QMessageBox.Yes)
if minecraft_JavaPath == "":
JavaPath_(self)
else:
main.GameStart(str(self.Player_name.text()), minecraft_dir, minecraft_version, minecraft_JVM, minecraft_JavaPath)
self.VersionsList.clear()
def InstalledVersionListButtonClicked(self):
self.DownloadVersionButton.setVisible(False)
self.VersionsList.clear()
minecraft_versions = minecraft_launcher_lib.utils.get_installed_versions(minecraft_directory=minecraft_dir)
Ver = 0
while Ver <= len(minecraft_versions) - 1:
self.VersionsList.addItem(minecraft_versions[Ver]["id"])
Ver = Ver + 1
def DownloadVersionsButtonClicked(self):
self.DownloadVersionButton.setVisible(True)
self.VersionsList.clear()
VersionsList = minecraft_launcher_lib.utils.get_version_list()
Ver = 0
while Ver <= len(VersionsList) - 1:
self.VersionsList.addItem(VersionsList[Ver]["id"])
Ver = Ver + 1
def DownloadButtonClicked(self):
def warnversion_(self):
reply = QMessageBox.warning(self, '警告', "未选择版本,可点击版本列表选择版本", QMessageBox.Yes)
try:
DownloadVersion = self.VersionsList.selectedItems()[0].text()
minecraft_launcher_lib.install.install_minecraft_version(DownloadVersion, minecraft_dir)
except:
warnversion_(self)
def findJava(self):
Java = minecraft_launcher_lib.java_utils.find_system_java_versions()
Ver = 0
while Ver <= len(Java) - 1:
self.JavaList.addItem(Java[Ver])
Ver = Ver + 1
def SettingButtonClicked(self):
# 隐藏
self.SettingButton.setVisible(False)
self.DownloadVersionButton.setVisible(False)
self.title.setVisible(False)
self.DownloadButton.setVisible(False)
self.VersionsList.setVisible(False)
self.Player_name.setVisible(False)
self.InstalledListButton.setVisible(False)
self.StartGameButton.setVisible(False)
self.Player_name_label.setVisible(False)
# 显示
self.BackButton.setVisible(True)
self.JavaLabel.setVisible(True)
self.SettingLabel.setVisible(True)
self.JavaList.setVisible(True)
self.JavaButton.setVisible(True)
def BackButtonClick(self):
self.SettingButton.setVisible(True)
self.title.setVisible(True)
self.DownloadButton.setVisible(True)
self.VersionsList.setVisible(True)
self.Player_name.setVisible(True)
self.InstalledListButton.setVisible(True)
self.StartGameButton.setVisible(True)
self.Player_name_label.setVisible(True)
self.BackButton.setVisible(False)
self.JavaLabel.setVisible(False)
self.SettingLabel.setVisible(False)
self.JavaList.setVisible(False)
self.JavaButton.setVisible(False)
def JavaButtonClick(self):
def informaiton_(self):
reply = QMessageBox.information(self, '信息', "Java选择成功!", QMessageBox.Yes)
global minecraft_JavaPath
minecraft_JavaPath = self.JavaList.currentText()
informaiton_(self)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
Ui = Ui_launcher()
Ui.initUI()
sys.exit(app.exec_())
main.py
# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtGui, QtWidgets
import sys
import minecraft_launcher_lib
import subprocess
import os
import launcher
current_max = 0
def set_status(status: str):
print(status)
def set_progress(progress: int):
if current_max != 0:
print(f"{progress}/{current_max}")
def set_max(new_max: int):
global current_max
current_max = new_max
def mkdir(path):
folder = os.path.exists(path)
if not folder: # 判断是否存在文件夹如果不存在则创建为文件夹
os.makedirs(path) # makedirs 创建文件时如果路径不存在会创建这个路径
else:
pass
def GameStart(player_name="str", minecraft_dir= "str", minecraft_version="str", JVM='str', JavaPath = "str"):
minecraft_launcher_lib.install.install_minecraft_version(minecraft_version, minecraft_dir)
options = minecraft_launcher_lib.utils.generate_test_options()
Xmx = "-Xmx" + JVM
player_name = str(player_name)
JavaPath = JavaPath + "/bin/java.exe"
# options
options['jvmArguments'] = [Xmx]
options['username'] = player_name
options['executablePath'] = JavaPath
options["launcherName"] = launcher.launcher_name
options["launcherVersion"] = launcher.launcher_version
# 生成启动命令
minecraft_command = minecraft_launcher_lib.command.get_minecraft_command(minecraft_version, minecraft_dir, options)
# 输入启动命令
subprocess.run(minecraft_command)