Import Os
Import Os
import json
import requests
import subprocess
import tkinter as tk
from tkinter import messagebox, ttk
from tqdm import tqdm
import logging
import zipfile
import sys
# Configure logging
logging.basicConfig(filename='minecraft_launcher.log', level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s')
class MinecraftLauncher:
def __init__(self, master):
self.master = master
master.title("Minecraft Launcher")
master.resizable(False, False) # Make the window unresizable
# Launch button
self.launch_button = ttk.Button(master, text="Launch",
command=self.launch_minecraft)
self.launch_button.grid(row=1, column=0, columnspan=2, padx=10, pady=(0,
40))
# Progress label
self.progress_label = ttk.Label(master, text="")
self.progress_label.grid(row=2, column=0, columnspan=2, padx=10, pady=(0,
5), sticky="w")
# Progress bar
self.progress_bar = ttk.Progressbar(master, orient=tk.HORIZONTAL,
length=400, mode='determinate') # Set width to 400px
self.progress_bar.grid(row=3, column=0, columnspan=2, padx=10, pady=(0,
10))
# Settings button
self.settings_button = ttk.Button(master, text="Settings")
self.settings_button.grid(row=4, column=1, padx=10, pady=(0, 10),
sticky="e")
return path
except Exception as e:
logging.error(f"Failed to download file from {url}: {e}")
messagebox.showerror("Error", f"Failed to download {file_name}: {e}")
return None
# Download LWJGL
def download_lwjgl(self):
lwjgl_zip_url = "https://altushost-swe.dl.sourceforge.net/project/java-
game-lib/Official%20Releases/LWJGL%202.9.3/lwjgl-2.9.3.zip"
lwjgl_zip_path = os.path.join(os.path.expanduser("~"), ".minecraft",
"lwjgl-2.9.3.zip")
lwjgl_path = os.path.join(os.path.expanduser("~"), ".minecraft", "lwjgl-
2.9.3")
if not os.path.exists(lwjgl_path):
downloaded_file = self.download_file(lwjgl_zip_url, lwjgl_zip_path,
"lwjgl-2.9.3.zip")
if downloaded_file:
try:
with zipfile.ZipFile(downloaded_file, 'r') as zip_ref:
zip_ref.extractall(os.path.dirname(lwjgl_path)) # Extract
to parent directory to handle nested structure
logging.info(f"Extracted LWJGL to {lwjgl_path}")
print(f"Extracted LWJGL to {lwjgl_path}") # Print the
extracted path
except Exception as e:
logging.error(f"Failed to extract LWJGL: {e}")
messagebox.showerror("Error", f"Failed to extract LWJGL: {e}")
return None
else:
logging.info(f"LWJGL already extracted at {lwjgl_path}")
print(f"LWJGL already extracted at {lwjgl_path}") # Print the existing
path
if missing_files:
logging.error(f"Missing LWJGL native libraries: {',
'.join(missing_files)}")
messagebox.showerror("Error", f"Missing LWJGL native libraries: {',
'.join(missing_files)}")
return None
appdata_path = os.path.expandvars("%APPDATA%")
version_dir = os.path.join(appdata_path, ".minecraft",
"versions", version_id)
if not os.path.exists(version_dir):
os.makedirs(version_dir)
jar_url = version_details['downloads']['client']['url']
jar_path = os.path.join(version_dir, f"{version_id}.jar")
self.download_file(jar_url, jar_path, f"{version_id}.jar")
return version_details
except Exception as e:
logging.error(f"Failed to download Minecraft version
{version_id}: {e}")
messagebox.showerror("Error", f"Failed to download
Minecraft version {version_id}: {e}")
return None
# Launch Minecraft
def launch_minecraft(self):
selected_version = self.version_var.get()
if not selected_version:
messagebox.showerror("Error", "Please select a Minecraft version.")
return
if not os.path.exists(mc_jar):
messagebox.showerror("Error", f"Minecraft version {selected_version}
not found.")
return
try:
subprocess.run(command, check=True)
except subprocess.CalledProcessError as e:
logging.error(f"Failed to launch Minecraft: {e}")
messagebox.showerror("Error", f"Failed to launch Minecraft: {e}")
except Exception as e:
logging.error(f"Failed to launch Minecraft: {e}")
messagebox.showerror("Error", f"Failed to launch Minecraft: {e}")
def main():
root = tk.Tk()
minecraft_launcher = MinecraftLauncher(root)
root.mainloop()
if __name__ == "__main__":
main()