You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 06:10:03