From ace96dfc3abaf20de24d4e97599f5b57c9c61dc3 Mon Sep 17 00:00:00 2001 From: Roland W-H Date: Tue, 18 Mar 2025 19:25:11 +0000 Subject: [PATCH] make code compatible with PyInstaller --- .gitignore | 9 ++++++++- SIPPCompare.spec | 44 ++++++++++++++++++++++++++++++++++++++++++ src/main_window.py | 3 ++- src/output_window.py | 4 +++- src/platform_edit.py | 3 ++- src/resource_finder.py | 13 +++++++++++++ 6 files changed, 72 insertions(+), 4 deletions(-) create mode 100644 SIPPCompare.spec create mode 100644 src/resource_finder.py diff --git a/.gitignore b/.gitignore index 771a5b3..1821ef2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,9 @@ /designer.exe - Shortcut.lnk -.idea/workspace.xml \ No newline at end of file +.idea/workspace.xml +.idea/discord.xml +.idea/encodings.xml +build/ +dist/ +output/ +src/*/__pycache__/ +src/__pycache__/ \ No newline at end of file diff --git a/SIPPCompare.spec b/SIPPCompare.spec new file mode 100644 index 0000000..637d81f --- /dev/null +++ b/SIPPCompare.spec @@ -0,0 +1,44 @@ +# -*- mode: python ; coding: utf-8 -*- + + +a = Analysis( + ['src\\main.py'], + pathex=[], + binaries=[], + datas=[('gui/*.ui', 'gui')], + hiddenimports=[], + hookspath=[], + hooksconfig={}, + runtime_hooks=[], + excludes=[], + noarchive=False, + optimize=0, +) +pyz = PYZ(a.pure) + +exe = EXE( + pyz, + a.scripts, + [], + exclude_binaries=True, + name='SIPPCompare', + debug=False, + bootloader_ignore_signals=False, + strip=False, + upx=True, + console=False, + disable_windowed_traceback=False, + argv_emulation=False, + target_arch=None, + codesign_identity=None, + entitlements_file=None, +) +coll = COLLECT( + exe, + a.binaries, + a.datas, + strip=False, + upx=True, + upx_exclude=[], + name='SIPPCompare', +) diff --git a/src/main_window.py b/src/main_window.py index cd9b0f0..e93499e 100644 --- a/src/main_window.py +++ b/src/main_window.py @@ -3,6 +3,7 @@ from PyQt6.QtWidgets import QMainWindow, QWidget from PyQt6 import uic import output_window +import resource_finder class SIPPCompare(QMainWindow): @@ -10,7 +11,7 @@ class SIPPCompare(QMainWindow): def __init__(self, plat_edit_win: QWidget): super().__init__() # Import Qt Designer UI XML file - uic.loadUi("gui/main_gui.ui", self) + uic.loadUi(resource_finder.get_res_path("gui/main_gui.ui"), self) # Initialise class variables # Inputs diff --git a/src/output_window.py b/src/output_window.py index 1765a51..e24817a 100644 --- a/src/output_window.py +++ b/src/output_window.py @@ -4,12 +4,14 @@ from PyQt6 import uic import datetime import os +import resource_finder + class OutputWindow(QWidget): def __init__(self): super().__init__() # Import Qt Designer UI XML file - uic.loadUi("gui/output_window.ui", self) + uic.loadUi(resource_finder.get_res_path("gui/output_window.ui"), self) # Initialise class variables self.results_str = "" diff --git a/src/platform_edit.py b/src/platform_edit.py index 06573cc..a8ad61c 100644 --- a/src/platform_edit.py +++ b/src/platform_edit.py @@ -5,13 +5,14 @@ from PyQt6 import uic from widgets.fastedit_spinbox import FastEditQDoubleSpinBox import main_window +import resource_finder class PlatformEdit(QWidget): def __init__(self, autofill: bool): super().__init__() # Import Qt Designer UI XML file - uic.loadUi("gui/platform_edit.ui", self) + uic.loadUi(resource_finder.get_res_path("gui/platform_edit.ui"), self) # Initialise class variables # Create main window object, passing this instance as param diff --git a/src/resource_finder.py b/src/resource_finder.py new file mode 100644 index 0000000..d0e006a --- /dev/null +++ b/src/resource_finder.py @@ -0,0 +1,13 @@ +import os.path +import sys + + +# If using PyInstaller, use it's temporary path, otherwise use cwd +# Credit: https://stackoverflow.com/questions/7674790/bundling-data-files-with-pyinstaller-onefile/13790741#13790741 +def get_res_path(relative_path): + try: + base_path = sys._MEIPASS + except AttributeError: + base_path = os.path.abspath(".") + + return os.path.join(base_path, relative_path) \ No newline at end of file