diff --git a/image_processor.spec b/image_processor.spec index 57c3c33..5b8c717 100644 --- a/image_processor.spec +++ b/image_processor.spec @@ -30,6 +30,7 @@ exe = EXE( upx_exclude=[], runtime_tmpdir=None, console=False, + icon='ui/images/image_processor.ico', disable_windowed_traceback=False, argv_emulation=False, target_arch=None, diff --git a/main.py b/main.py index c319361..0a7f8df 100644 --- a/main.py +++ b/main.py @@ -1,8 +1,10 @@ """ Main module for the Image Processor application. """ -from PIL import Image +from PIL import Image, ImageTk import customtkinter as ctk +import os +import sys from ui.menu import MenuBar # Import the new MenuBar class from ui.log_frame import LogWindow from ui.button_frame import ButtonFrame @@ -15,6 +17,15 @@ from controller import AppController from ui.preview_frame import PreviewFrame # Import the new PreviewFrame class +def resource_path(relative_path: str) -> str: + """Get absolute path to a resource (dev or PyInstaller).""" + try: + base_path = sys._MEIPASS # type: ignore[attr-defined] + except Exception: + base_path = os.path.abspath(".") + return os.path.join(base_path, relative_path) + + class ImageProcessorApp: """ @@ -34,6 +45,23 @@ class ImageProcessorApp: self.root.title("Image Processor") self.root.geometry("553x800") + # Window/taskbar icon (Windows prefers .ico) + try: + ico_path = resource_path("ui/images/image_processor.ico") + if os.path.exists(ico_path): + self.root.iconbitmap(ico_path) + except Exception: + pass + + # Cross-platform icon (uses PNG) + try: + png_path = resource_path("ui/images/image_processor.png") + if os.path.exists(png_path): + self._icon_photo = ImageTk.PhotoImage(Image.open(png_path)) + self.root.iconphoto(True, self._icon_photo) + except Exception: + pass + # Initialize the controller self.controller = AppController(self.root) diff --git a/main.spec b/main.spec index cb292c6..823807e 100644 --- a/main.spec +++ b/main.spec @@ -3,8 +3,12 @@ import glob import os # -*- mode: python ; coding: utf-8 -*- -# Collect all PNG and JPG images in the ui/images directory -image_files = [(file, "ui/images") for file in glob.glob("ui/images/*.*") if file.endswith(('.png', '.jpg', '.jpeg'))] +# Collect UI images/icons in the ui/images directory +image_files = [ + (file, "ui/images") + for file in glob.glob("ui/images/*.*") + if file.lower().endswith((".png", ".jpg", ".jpeg", ".ico")) +] block_cipher = None @@ -33,13 +37,15 @@ exe = EXE( a.zipfiles, a.datas, [], - name='main', + name='image_processor', debug=False, bootloader_ignore_signals=False, strip=False, upx=True, upx_exclude=[], runtime_tmpdir=None, + + icon='ui/images/image_processor.ico', disable_windowed_traceback=False, argv_emulation=False, diff --git a/ui/images/image_processor.ico b/ui/images/image_processor.ico new file mode 100644 index 0000000..db67965 Binary files /dev/null and b/ui/images/image_processor.ico differ diff --git a/ui/images/image_processor.png b/ui/images/image_processor.png new file mode 100644 index 0000000..26d60d1 Binary files /dev/null and b/ui/images/image_processor.png differ