From 7af3024a2521ee9971b6b0d48eb9f20a7fa0886c Mon Sep 17 00:00:00 2001 From: MinhNN Date: Sat, 7 Mar 2026 07:25:33 +0700 Subject: [PATCH] update build .exe --- 2023-11-03.webp | Bin 0 -> 7608 bytes ...re_Loader.exe => MiraV3_Firmware_Loader.exe | Bin build_windows.bat | 13 ++++++++----- icon.ico | Bin 0 -> 43896 bytes main.py | 17 ++++++++++++++--- run.sh | 11 +++++------ 6 files changed, 27 insertions(+), 14 deletions(-) create mode 100644 2023-11-03.webp rename IoT_Firmware_Loader.exe => MiraV3_Firmware_Loader.exe (100%) create mode 100644 icon.ico mode change 100644 => 100755 run.sh diff --git a/2023-11-03.webp b/2023-11-03.webp new file mode 100644 index 0000000000000000000000000000000000000000..3e889003161af9e42a937f43f6b9f7affae26bd6 GIT binary patch literal 7608 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 a0RjLA0000Q000000000-Z*OO8WdH#3akL}= literal 0 HcmV?d00001 diff --git a/IoT_Firmware_Loader.exe b/MiraV3_Firmware_Loader.exe similarity index 100% rename from IoT_Firmware_Loader.exe rename to MiraV3_Firmware_Loader.exe diff --git a/build_windows.bat b/build_windows.bat index 4fddc5f..d5e7650 100644 --- a/build_windows.bat +++ b/build_windows.bat @@ -5,7 +5,7 @@ REM Tao file .exe khong can cai Python REM ============================================ echo ======================================== -echo IoT Firmware Loader - Build for Windows +echo MiraV3 Firmware Loader - Build for Windows echo ======================================== echo. @@ -27,7 +27,9 @@ pip install PyQt6 scapy requests pyinstaller --quiet REM 4. Build .exe echo [3/4] Building executable... pyinstaller ^ - --name "IoT_Firmware_Loader" ^ + --name "MiraV3_Firmware_Loader" ^ + --icon "icon.ico" ^ + --add-data "icon.ico;." ^ --onefile ^ --windowed ^ --noconfirm ^ @@ -40,15 +42,16 @@ pyinstaller ^ --hidden-import "PyQt6.QtGui" ^ main.py + echo. echo [4/4] Build complete! echo. -if exist "dist\IoT_Firmware_Loader.exe" ( - echo ✅ SUCCESS: dist\IoT_Firmware_Loader.exe +if exist "dist\MiraV3_Firmware_Loader.exe" ( + echo ✅ SUCCESS: dist\MiraV3_Firmware_Loader.exe echo. echo File size: - for %%A in ("dist\IoT_Firmware_Loader.exe") do echo %%~zA bytes + for %%A in ("dist\MiraV3_Firmware_Loader.exe") do echo %%~zA bytes echo. echo Ban co the copy file .exe nay sang may khac va chay truc tiep. ) else ( diff --git a/icon.ico b/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..fc20d92ea9d86434b89994cdf4b8969a988bd245 GIT binary patch literal 43896 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 literal 0 HcmV?d00001 diff --git a/main.py b/main.py index cf4294d..82ceb60 100644 --- a/main.py +++ b/main.py @@ -1,4 +1,5 @@ import sys +import os import socket import ipaddress import platform @@ -116,6 +117,15 @@ def get_default_network(ip): return "192.168.1.0/24" +def resource_path(relative_path): + """ Get absolute path to resource, works for dev and for PyInstaller """ + try: + base_path = sys._MEIPASS + except Exception: + base_path = os.path.abspath(".") + return os.path.join(base_path, relative_path) + + def get_machine_info(): """Collect machine info.""" hostname = socket.gethostname() @@ -501,7 +511,8 @@ class App(QWidget): def __init__(self): super().__init__() - self.setWindowTitle("IoT Firmware Loader") + self.setWindowTitle("MiraV3 Firmware Loader") + self.setWindowIcon(QIcon(resource_path("icon.ico"))) self.firmware = None self.all_devices = [] # all scan results (unfiltered) self.devices = [] # currently displayed (filtered) @@ -516,12 +527,12 @@ class App(QWidget): layout.setContentsMargins(8, 6, 8, 6) # ── Title ── - title = QLabel("⚡ IoT Firmware Loader (MiraV3)") + title = QLabel("⚡ MiraV3 Firmware Loader") title.setObjectName("title") title.setAlignment(Qt.AlignmentFlag.AlignCenter) layout.addWidget(title) - copyright_label = QLabel(f"© {datetime.datetime.now().year} Smatec — R&D Software") + copyright_label = QLabel(f"© {datetime.datetime.now().year} Smatec — R&D Software Team. v1.0.0") copyright_label.setAlignment(Qt.AlignmentFlag.AlignCenter) copyright_label.setStyleSheet( "color: #9399b2; font-size: 11px; font-weight: 500; font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto;" diff --git a/run.sh b/run.sh old mode 100644 new mode 100755 index 4916c32..a6520cc --- a/run.sh +++ b/run.sh @@ -5,14 +5,13 @@ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" cd "$SCRIPT_DIR" # Activate virtual environment -if [ -d "venv" ]; then - source venv/bin/activate -else +if [ ! -d "venv" ]; then echo "❌ Virtual environment not found. Creating..." python3 -m venv venv - source venv/bin/activate - pip install PyQt6 scapy requests fi -echo "🚀 Starting IoT Firmware Loader..." +source venv/bin/activate +pip install -r requirements.txt --quiet + +echo "🚀 Starting MiraV3 Firmware Loader..." python main.py