From 4b687f8256577cdcb23d23ca9213e68ba3aa46e9 Mon Sep 17 00:00:00 2001 From: NikkeDoy Date: Wed, 11 Dec 2024 18:19:59 +0200 Subject: [PATCH] :tada: | Added icon and option to launch windowed. --- ResourceManager.py | 11 ++++++++ UserData.py | 25 ++++++++++++++++++ assets/icon.ico | Bin 0 -> 25214 bytes assets/icon.png | Bin 0 -> 7863 bytes main.py | 62 ++++++++++++++++++++------------------------- requirements.txt | 9 +++++++ 6 files changed, 72 insertions(+), 35 deletions(-) create mode 100644 ResourceManager.py create mode 100644 UserData.py create mode 100644 assets/icon.ico create mode 100644 assets/icon.png diff --git a/ResourceManager.py b/ResourceManager.py new file mode 100644 index 0000000..a7984fa --- /dev/null +++ b/ResourceManager.py @@ -0,0 +1,11 @@ +from PIL import ImageTk, Image +import os +import sys + +def resource_path(relative_path): + base_path = getattr(sys, '_MEIPASS', os.path.dirname(os.path.abspath(__file__))) + return os.path.join(base_path, relative_path) + +def get_image_and_resize(path_to_image, width, height): + image = Image.open(resource_path(path_to_image)).resize((width, height)) + return ImageTk.PhotoImage(image) diff --git a/UserData.py b/UserData.py new file mode 100644 index 0000000..1668b5c --- /dev/null +++ b/UserData.py @@ -0,0 +1,25 @@ +import os +import json +import appdirs + +app_name = 'FinnWarsLauncher' +author_name = 'NikkeDoy, NuffMan' +default_server_address = "23.88.63.235:14572" +default_username = "FinnWarsLauncher" +default_windowed = False + +def save_preferences(data): + config_dir = appdirs.user_config_dir(app_name, author_name) + os.makedirs(config_dir, exist_ok=True) + file_path = os.path.join(config_dir, 'config.json') + with open(file_path, 'w') as f: + json.dump(data, f) + +def get_preferences(): + config_dir = appdirs.user_config_dir(app_name, author_name) + file_path = os.path.join(config_dir, 'config.json') + if(os.path.isfile(file_path)): + with open(file_path, 'r') as f: + return json.load(f) + else: + return {"server": default_server_address, "username": default_username, "windowed": default_windowed} diff --git a/assets/icon.ico b/assets/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..0cf553d943ecbf7c3a92faced581cb6a1df0e5e5 GIT binary patch literal 25214 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 literal 0 HcmV?d00001 diff --git a/main.py b/main.py index 11a0912..2a1713b 100644 --- a/main.py +++ b/main.py @@ -1,38 +1,36 @@ from tkinter import * -from PIL import ImageTk, Image -import time import re -import userdata -import asyncio import subprocess -import os -import sys +import pyautogui -def resource_path(relative_path): - base_path = getattr(sys, '_MEIPASS', os.path.dirname(os.path.abspath(__file__))) - return os.path.join(base_path, relative_path) +import UserData +import ResourceManager def save_preferences(): - userdata.save_preferences({"server": server_address_field.get(), "username": username_field.get()}) + UserData.save_preferences({"server": server_address_field.get(), "username": username_field.get(), "windowed": windowed.get()}) save_preferences_button.config(state=DISABLED, text="Saved!") root.after(5000, lambda: save_preferences_button.config(state=NORMAL, text="Save")) def launch_exe(): - # Check for valid server address (Currently only supports numerical addresses (not domains)) + # Check for valid server address (Currently only supports numerical addresses (not domains.)) if not validate_server_address(server_address_field.get()): print(f"Invalid address \"{server_address_field.get()}\", please use a proper one...") server_address_field.delete(0, END) - server_address_field.insert(0, userdata.default_server_address) + server_address_field.insert(0, UserData.default_server_address) return + # Validate username by checking if username length is reasonable. if not validate_username(username_field.get()): print(f"Username \"{username_field.get()}\" is too long, please use a shorter one...") username_field.delete(0, END) - username_field.insert(0, userdata.default_username) + username_field.insert(0, UserData.default_username) return - print("IP Address: " + server_address_field.get()) - print("Username: " + username_field.get()) + # If game needs to be windowed then we use BF42Plus provided "workaround." + if windowed.get(): + pyautogui.keyDown("shift") + root.after(5000, lambda: pyautogui.keyUp("shift")) + subprocess.call([ "./Battlefield 1942/Battlefield 1942/BF1942.exe", "+game", "FinnWars", @@ -61,7 +59,7 @@ def validate_server_address(server_address): def validate_username(username): return len(username) <= 16 -preferences = userdata.get_preferences() +preferences = UserData.get_preferences() # Create the main window root = Tk() @@ -75,12 +73,12 @@ window_width = int(720*scaling) window_height = int(360*scaling) root.geometry(str(window_width) + "x" + str(window_height)) -# Background image scaled correctly -image = Image.open(resource_path("assets/background.png")) -resized_image = image.resize((window_width, window_height)) -photo = ImageTk.PhotoImage(resized_image) +window_icon = ResourceManager.get_image_and_resize("assets/icon.png", 128, 128) +root.wm_iconphoto(False, window_icon) -background_label = Label(root, image=photo) +background_image = ResourceManager.get_image_and_resize("assets/background.png", window_width, window_height) + +background_label = Label(root, image=background_image) background_label.pack(fill=BOTH, expand = YES) # Create the text fields @@ -91,6 +89,10 @@ server_address_label = Label(root, text="Server Address:", font=font, fg="black" server_address_field = Entry(root, font=font, width=box_width) username_label = Label(root, text="Username:", font=font, fg="black", width=box_width) username_field = Entry(root, font=font, width=box_width) +windowed = BooleanVar() +windowed.set(preferences["windowed"]) +settings_label = Label(root, text="Settings", font=font, fg="black", width=int(window_width/11.3)) +windowed_checkbutton = Checkbutton(root, text="Windowed", variable=windowed, font=font, width=int(window_width/26)) if "server" in preferences: server_address_field.insert(0, preferences["server"]) @@ -108,28 +110,18 @@ button_width = int(window_width/48) save_preferences_button = Button(root, text="Save", command=save_preferences, width=button_width) launch_game = Button(root, text="Launch", command=launch_exe, width=button_width) -menu_bar = Menu(root) -root.config(menu=menu_bar) - -file_menu = Menu(root, tearoff=0) -file_menu.add_command(label="Settings") -file_menu.add_command(label="Exit", command=root.quit) -menu_bar.add_cascade(label="File", menu=file_menu) # Place the widgets on the window server_address_label.place(x=window_width/72, y=window_height/36) server_address_field.place(x=window_width/72, y=int(window_height/7.2)) username_label.place(x=int(window_width/1.95), y=window_height/36) username_field.place(x=int(window_width/1.95), y=int(window_height/7.2)) + +settings_label.place(x=int(window_width/72), y=int(window_height/3.2)) +windowed_checkbutton.place(x=int(window_width/72), y=int(window_height/2.4)) + save_preferences_button.place(x=int(window_width/2.4), y=int(window_height/1.16)) launch_game.place(x=int(window_width/1.4), y=int(window_height/1.16)) -#server_address_label.place(x=10, y=20) -#server_address_field.place(x=10, y=50) -#username_label.place(x=370, y=20) -#username_field.place(x=370, y=50) -#save_preferences_button.place(x=300, y=310) -#launch_game.place(x=510, y=310) - # Start the main event loop root.mainloop() diff --git a/requirements.txt b/requirements.txt index 2794044..7556be2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,11 +1,20 @@ altgraph==0.17.4 appdirs==1.4.4 asyncio==3.4.3 +MouseInfo==0.1.3 packaging==24.2 pillow==11.0.0 pyasn1==0.6.1 +PyAutoGUI==0.9.54 +PyGetWindow==0.0.9 pyinstaller==6.11.1 pyinstaller-hooks-contrib==2024.10 +PyMsgBox==1.0.9 +pyperclip==1.9.0 +PyRect==0.2.0 +PyScreeze==1.0.1 +python3-xlib==0.15 +pytweening==1.2.0 rsa==4.9 setuptools==75.6.0 tk==0.1.0