使用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
相关产品推荐
相关产品推荐

