from os import path, getenv, mkdir import sys from platform import system from pathlib import Path def resource_path(relative_path: str) -> Path: """ Get absolute path to resource, works for dev and for PyInstaller bundle. PyInstaller stores bundled files in _MEIPASS folder. """ try: base_path = Path(sys._MEIPASS) # PyInstaller temp folder except AttributeError: base_path = Path(__file__).parent.parent.parent # Dev environment: source/ folder return path.join(base_path, relative_path) def get_data_dir() -> Path: return resource_path("data") def get_lang_path() -> Path: return path.join(get_data_dir(), "lang") def get_asset_path(asset: str) -> Path: return path.join(get_data_dir(), "assets", f"{asset}.png") def get_asset_svg_path(asset: str) -> Path: return path.join(get_data_dir(), "assets", f"{asset}.svg") def get_user_data_dir(app_name: str) -> Path: home = Path.home() os = system() if os == "Windows": appdata = getenv('APPDATA') if appdata: user_data_path = path.join(Path(appdata), app_name) else: user_data_path = path.join(home, "AppData", "Roaming", app_name) elif os == "Darwin": user_data_path = path.join(home, "Library", "Application Support", app_name) else: user_data_path = path.join(home, ".local", "share", app_name) if not path.exists(user_data_path): mkdir(user_data_path) return user_data_path def get_current_dir() -> Path: """ Return the directory where the exe or main script is located. """ if getattr(sys, 'frozen', False): # If the application is frozen (PyInstaller) return str(Path(sys.executable).parent) else: # If running in a normal Python environment return str(Path(__file__).parent.parent.parent)