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

使用tkextrafont编译程序后找不到字体文件的问题求助

解决tkextrafont打包后WinError 2路径找不到问题

1. 修复打包时tkextrafont资源缺失问题

打包工具(如PyInstaller)不会自动收集tkextrafont的底层依赖文件,导致程序解压到临时目录时缺少tkextrafont相关资源,需手动修改.spec文件补充:

  • 找到Python环境中tkextrafont的安装目录,一般在Lib\site-packages\tkextrafont下
  • 打开生成的.spec文件,在datas列表中添加tkextrafont的整个目录,同时确保字体文件路径也被包含:
a = Analysis(
    # 保留原有配置
    datas=[
        ('resources/fonts/', 'resources/fonts'),  # 你的字体文件目录
        ('path/to/site-packages/tkextrafont/', 'tkextrafont')  # 替换为实际tkextrafont路径
    ],
    # 保留原有配置
)

执行pyinstaller your_script.spec重新打包。

2. 正确获取打包后的字体文件路径

打包后程序的工作目录并非原项目目录,os.getcwd()无法获取正确路径,需用sys._MEIPASS获取临时解压目录:
修改代码如下:

import customtkinter
from tkextrafont import Font
import sys
import os

def fetch_resource(relative_path):
    try:
        # 打包后临时解压目录
        base_path = sys._MEIPASS
    except Exception:
        # IDE运行时的项目根目录
        base_path = os.path.abspath(".")
    return os.path.join(base_path, relative_path)

app = customtkinter.CTk()
app.title("my app")
app.geometry("400x150")

# 加载自定义字体并直接使用字体对象
custom_font = Font(file=fetch_resource('resources/fonts/cs_regular.ttf'))
logo_label = customtkinter.CTkLabel(app, text="Text", font=(custom_font, 30))
logo_label.grid(row=0, column=0, padx=20, pady=(20, 10))

app.mainloop()

注:原代码中self.sidebar_frame未定义,示例中替换为app,实际使用时请根据自身UI结构调整。

3. 替代方案:不依赖tkextrafont,直接用系统API加载字体

如果上述方法仍有问题,可通过ctypes调用Windows API加载字体,避免tkextrafont的依赖问题:

import customtkinter
import os
import sys
import ctypes

def load_custom_font(font_path):
    try:
        base_path = sys._MEIPASS
    except Exception:
        base_path = os.path.abspath(".")
    full_path = os.path.join(base_path, font_path)
    # 将字体加载到系统
    ctypes.windll.gdi32.AddFontResourceW(full_path)
    # 返回字体内部名称(需与ttf文件实际字体名一致)
    return "CS Regular"

app = customtkinter.CTk()
app.title("my app")
app.geometry("400x150")

font_name = load_custom_font('resources/fonts/cs_regular.ttf')
logo_label = customtkinter.CTkLabel(app, text="Text", font=(font_name, 30))
logo_label.grid(row=0, column=0, padx=20, pady=(20, 10))

app.mainloop()

使用此方法时,只需在.spec文件的datas中添加字体文件目录即可,无需处理tkextrafont的资源。

内容的提问来源于stack exchange,提问作者Ben

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 01:10:15