MCPL:用Python+minecraft_launcher_lib+PyQt做的Minecraft启动器

开始

有一天我网上冲浪看到了一篇博客,说的是用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)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值