如何获取CustomTkinter主题JSON文件正确路径以解决打包报错
CustomTkinter打包exe后主题JSON文件缺失问题解决方法
问题背景
使用CustomTkinter开发的GUI程序,通过auto-py-to-exe打包为exe后启动失败,提示FileNotFoundError,找不到主题JSON文件(如blue.json)。错误中显示的/var/folders/.../T/_MEI...路径是PyInstaller(auto-py-to-exe基于PyInstaller)运行时自动创建的临时解压目录,程序会将打包的资源临时解压到这里,问题根源是主题文件未被正确打包或路径计算错误。
方案一:通过auto-py-to-exe正确打包资源(推荐,无需修改代码)
直接在打包时将CustomTkinter的assets目录包含进exe:
- 打开auto-py-to-exe,找到Additional Files区域
- 点击
Add Folder,选择本地CustomTkinter的assets目录,路径为:/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/customtkinter/assets - 在
Destination Folder输入框中填写customtkinter/assets,确保打包后资源路径与程序运行时的预期路径匹配 - 重新生成exe文件,运行即可
方案二:修改代码路径计算逻辑(方案一无效时使用)
PyInstaller打包后会通过sys._MEIPASS变量提供临时解压目录的路径,利用该变量可精准定位主题文件:
替换原主题加载代码为以下内容:
import sys import os import json # ... 其他业务代码 ... if theme_name_or_path in cls._built_in_themes: # 判断是否处于打包后的运行环境 if hasattr(sys, '_MEIPASS'): # 打包后:从临时解压目录拼接资源路径 assets_root = os.path.join(sys._MEIPASS, "customtkinter", "assets") else: # 未打包时:使用本地开发环境的相对路径 script_dir = os.path.dirname(os.path.abspath(__file__)) assets_root = os.path.join(script_dir, "../../../assets") theme_file_path = os.path.join(assets_root, "themes", f"{theme_name_or_path}.json") with open(theme_file_path, "r") as f: cls.theme = json.load(f)
为什么之前的PR修复无效?
PR中通过多层os.path.dirname计算父目录的方式,仅适用于未打包的开发环境。打包后__file__指向临时目录中的文件,多层向上查找会得到错误的路径,而sys._MEIPASS是PyInstaller官方提供的临时目录定位方式,更可靠。
内容的提问来源于stack exchange,提问作者Darkshadogt
相关产品推荐
相关产品推荐

