From 43c5bdac8c77ee99a6f22d7082f4afa83754d6ca Mon Sep 17 00:00:00 2001 From: SitiWeb <70724099+SitiWeb@users.noreply.github.com> Date: Fri, 23 Jan 2026 16:53:14 +0100 Subject: [PATCH] Add image processor PNG file to UI assets --- image_processor.spec | 1 + main.py | 30 +++++++++++++++++++++++++++++- main.spec | 12 +++++++++--- ui/images/image_processor.ico | Bin 0 -> 18427 bytes ui/images/image_processor.png | Bin 0 -> 2732 bytes 5 files changed, 39 insertions(+), 4 deletions(-) create mode 100644 ui/images/image_processor.ico create mode 100644 ui/images/image_processor.png 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 0000000000000000000000000000000000000000..db6796523098a3d083127de29c81733146e2c16a GIT binary patch literal 18427 zcmagFV{|4_(>8j?wryi#+nU(6ZQGdGwkNjjMJcKtm>I#r}EPVO$nX~M20ZF`8dE|#9 z8LS$3gCf>eq>UcT@69EHg)4f-;h$TY(d%KdoDGnLnCPij=rT5O(!80{ESb;0yQQmJ zkL<(udR*rGj`Ku?nTCl$>>a?6iO0Y)K#-p>!NhjSA-N#9p+J@saJXQM;qdT_pk7`$b3iDwp%!moKn$Q1&;c7b#! z_$w(pNatF$XcY#Gb3+f8cQJ)v^HOiS(o39o⋙D1LyV&PiJMOk6~Jvv-S_$a?nZ0 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 literal 0 HcmV?d00001 diff --git a/ui/images/image_processor.png b/ui/images/image_processor.png new file mode 100644 index 0000000000000000000000000000000000000000..26d60d134e7ee385e8fa3e19db889c23cb903f9f GIT binary patch literal 2732 zcmb7`c|6qlAIIM_V;SWbM~;{=gc-*wt&nqQ)K->RDQC`5F`?YY_*N>`icOneB5Z|C zV#`%-iltu}shLg5t#KvGxMrB&*nYeJ{r2(OzdrBJ@&0_?pZDYQc|G5$G>3hXo3?HO z0LlGdQ=I@%LK6j8QDNhGx+D-_)0zEL8|RqZnSRHVqe03Yb01zb%oo?>y)gYMFvrhb zCtXof($2js?}FcXKbKRFbtA{xFQ72C!Nvv>wajz2k$U8(c7@Dw)0>tkDl4Stdfd<^(znf$k`fet@FiFIQX~c*3$X7WN#P|Mk ztHhote?y=Ze9Md`V9(#_U4lM1wj;|COCm8f`-x2peDL-HIMgS1|9aXV&% z>rVuEYYUH*>04vR&5++5^fT?4lGGj)ji1tEE28)%8&8oS;Zh!{guNAxecgGkH|_c} z_!Rd5c{N^D2cKfDAkH6ZZdgJnNtE`RV%UZ!t#WYiCw2_Pn2IBl{7?&k6j4g=gjfvo z7~V)hcpfvs(nwa=4&E|2DGlGLeLAETf=0KVl!W{1NV(b1UjmuY?A=fy0?Dss!E+6j zA9*MiXnbT~)mI#_rAAP@ifNomkpkQiHwfd3@!4|t&*?iX3zY(jYNVYQV5f`{!Eh?S za;zu=Wgb^NP5jW>;@@)Ult5=W=C&%spgdlq&q)5t zgDSH_D2Bo$6)G0hT9_dfC)#F`Zn!+ZpWs)$+DJDLa0LQ?b0uv8qwizfbRBDDK_>0a zW)7*bJ=+UiVAYoXta^P>FKWo7WBTRPK+RD5)?#aPrzjHlz$ECnOLt?4qStznBr9P6 z?@qltuk!|!wy3Qg_7A=jT3T)~(kRDC9pH8nkdo^`USBRswv|oALv{EY(Wz47LCnWz z?DZ8f6;FQVS2H*ivcsKT$1AmdKk~HjX#DI_?ukoS5b1q1`|Xr!jOJ2R`dE!=uapd6 zg&{b7WY<{5X8++<(3c-aUYcst6O7xNQ-N4=r1%DpJGF#s#-qVTlC^!*v9fM__h;9z zxm)~HmKInHJ5at|%ZdstXU7%mC+Q`LsC-zz%HuA+YvUyzbWVY0dRyVwN+FDdc4KR+ z8@#?{jQ7yS_L`ngN=sP`jutQB&62W?#6^q;ZzLm%KscQ?Q>=JlwI7rGlz_O#dw24r z#G)n^Hdlv#eEu$*lwlEEHdj|_s(F58AW#8MT0dI*M#;S{XhWsTD5z3Q# z1;MLr-CjwfuE8g(C-$`9D@0PR)(q$WOG&Noymx41Q_MTFv<%}!QzaP`k~k4ncfReC zbh(;k+-TR!moNK%@pn9$Fr5AH&d1%9H7tV7i+%rlXpP=r727MZ{8zzjgjri>XX?3W6)TXWYwh(vP@?gC;r?vko`8= z(20Ly@W^2DJ93w z=QO}3YdHAnE7(h*aM-ew^{XWM8|s|S|B5h68pgU2-`_{_Ltw$-O^ZToYIP|=xeo!4ctUcm?vtH1@;d4Cy5kboWfVISvhZ_ew{NsThmkXeTI(UAWw!CX#lj;<`C4i~CT0WkPJe`Z}mXq(3E*DlS2?L za=jJVtW6}|n-h8>5AF>W2kjyN!2w-hHmet_AET@*{Q39)Z8KCi3H3KsiQJVL1F*QM zNqikUvr{;tPpn#*J|#_*=Aly#k5_)`j|Rg$Dv=edVkcIi(hv2|G|2oCGsM-=VBy#g z&$~HhNIyq(&`!Z^h$I6hI1ynfbYh6K1?pr(OWYM=dr0^V6RUNwgcE@FF=++6fK-Ks zV=$^NU*J3)dm95ZMPZc$t?K`*Nc;Rjnj_W}4Rz<`*SjLF3ae1qZ|6Y0Z|igJKT_?6 Au>b%7 literal 0 HcmV?d00001