92 lines
2.3 KiB
Python
92 lines
2.3 KiB
Python
#!/usr/bin/env python
|
||
# -*- coding: utf-8 -*-
|
||
"""
|
||
图标工具模块
|
||
负责图标路径获取和窗口图标设置
|
||
"""
|
||
import os
|
||
import sys
|
||
|
||
|
||
def get_icons_dir() -> str:
|
||
"""获取 icons 目录的绝对路径
|
||
|
||
Returns:
|
||
icons 目录的绝对路径
|
||
"""
|
||
# 获取当前文件所在目录(ui/utilities/)
|
||
current_dir = os.path.dirname(os.path.abspath(__file__))
|
||
|
||
# 往上两级到项目根目录
|
||
project_root = os.path.dirname(os.path.dirname(current_dir))
|
||
|
||
# 拼接 icons 文件夹
|
||
icons_dir = os.path.join(project_root, "icons")
|
||
|
||
# 如果是打包后的应用,使用 sys._MEIPASS
|
||
if getattr(sys, 'frozen', False):
|
||
# 打包后的应用
|
||
icons_dir = os.path.join(sys._MEIPASS, "icons")
|
||
|
||
return icons_dir
|
||
|
||
|
||
def get_icon_path(icon_name: str = "NexusLauncher.ico") -> str:
|
||
"""获取图标文件的绝对路径
|
||
|
||
Args:
|
||
icon_name: 图标文件名,默认为 "NexusLauncher.ico"
|
||
|
||
Returns:
|
||
图标文件的绝对路径
|
||
"""
|
||
icons_dir = get_icons_dir()
|
||
icon_path = os.path.join(icons_dir, icon_name)
|
||
return icon_path
|
||
|
||
|
||
def set_window_icon(window, icon_name: str = "NexusLauncher.ico"):
|
||
"""为窗口设置图标
|
||
|
||
Args:
|
||
window: Tkinter 窗口对象
|
||
icon_name: 图标文件名,默认为 "NexusLauncher.ico"
|
||
"""
|
||
icon_path = get_icon_path(icon_name)
|
||
|
||
if os.path.exists(icon_path):
|
||
try:
|
||
window.iconbitmap(icon_path)
|
||
window.wm_iconbitmap(icon_path)
|
||
except Exception as e:
|
||
print(f"Failed to set window icon: {e}")
|
||
else:
|
||
print(f"Icon file not found: {icon_path}")
|
||
|
||
|
||
def setup_dialog_icon(dialog, icon_name: str = "NexusLauncher.ico"):
|
||
"""为对话框设置图标(包含延迟设置以确保生效)
|
||
|
||
Args:
|
||
dialog: 对话框窗口对象
|
||
icon_name: 图标文件名,默认为 "NexusLauncher.ico"
|
||
"""
|
||
icon_path = get_icon_path(icon_name)
|
||
|
||
if not os.path.exists(icon_path):
|
||
return
|
||
|
||
def set_icon():
|
||
try:
|
||
dialog.iconbitmap(icon_path)
|
||
dialog.wm_iconbitmap(icon_path)
|
||
except Exception:
|
||
pass
|
||
|
||
# 立即设置
|
||
set_icon()
|
||
|
||
# 延迟设置(确保生效)
|
||
dialog.after(50, set_icon)
|
||
dialog.after(200, set_icon)
|