Files
cmshoppe/app/assets/__init__.py
T
chengmaandClaude Fable 5 049d4b6bbc feat(brand): add application logo for exe and window icon
新增品牌标识并接入运行时与打包流程。

- `scripts/gen_logo.py` 从单一几何定义同时产出 SVG 母版、多尺寸 ICO 和
  PNG 预览,避免母版与位图漂移;改样式改脚本后重新生成即可。
- 标记为暖橙圆角徽章 + 白色上升箭头(提升并发布)+ 四角星芒(AI 生成),
  刻意避开蝦皮官方购物袋标识,避免暗示官方关联。
- ICO 含 16/20/24/32/40/48/64/128/256 九档,每档从矢量几何独立渲染而非
  由大图缩放,保证任务栏与资源管理器小尺寸清晰。
- `app/assets` 作为可导入包提供无 Qt 依赖的路径解析,兼容源码树、
  PyInstaller onedir 的 _MEIPASS 与 exe 同级目录三种布局。
- `widgets.app_icon()` 在 Qt 缺失或资源未生成时返回 None,调用方容错;
  在 QApplication 上设置图标以便任务栏、对话框和消息框一并继承,
  MainWindow 另行设置以覆盖直接构造窗口的测试路径。
- 两个 spec 均加 `icon=`,主 spec 收集资源到 datas 并在资源缺失时直接
  报错提示先跑生成脚本。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-20 16:39:18 +08:00

58 lines
1.4 KiB
Python

"""Bundled static assets (application icon).
The icon ships inside the package so the same file backs the window icon at
runtime and the executable icon at build time. Keep this module free of Qt
imports: the packaging spec imports it while collecting data files.
Regenerate the files with ``py -3.10 scripts/gen_logo.py``.
"""
from __future__ import annotations
import os
import sys
ICON_NAME = "cmshopee.ico"
ICON_PNG_NAME = "cmshopee-256.png"
_PACKAGE_DIR = os.path.dirname(os.path.abspath(__file__))
def _candidate_paths(name):
"""Locations to probe, covering source tree and PyInstaller onedir."""
yield os.path.join(_PACKAGE_DIR, name)
bundle_dir = getattr(sys, "_MEIPASS", None)
if bundle_dir:
yield os.path.join(bundle_dir, "app", "assets", name)
if getattr(sys, "frozen", False):
yield os.path.join(
os.path.dirname(os.path.abspath(sys.executable)),
"app",
"assets",
name,
)
def asset_path(name):
"""Return an existing asset path, or None when it is not bundled."""
for candidate in _candidate_paths(name):
if candidate and os.path.isfile(candidate):
return candidate
return None
def icon_path():
"""Path to the multi-size Windows icon, or None when unavailable."""
return asset_path(ICON_NAME)
def icon_png_path():
"""Path to the 256px PNG fallback, or None when unavailable."""
return asset_path(ICON_PNG_NAME)