非常游戏网
怎样在Python Tkinter中使用自定义字体_通过tkFont模块注册本地字体文件

怎样在Python Tkinter中使用自定义字体_通过tkFont模块注册本地字体文件

2026-05-29日常编程43845

Python 3 中 tkFont 已被移除,需改用 tkinter.font;Tkinter 不支持直接加载本地字体文件,必须先通过系统安装字体,再用 font.families() 确认名称后使用。

tkFont 在 Python 3 中已不存在,改用 font 模块

Python 3.0 起 tkFont 模块被移除,所有字体操作统一由 tkinter.font 模块提供。如果你在代码里写了 import tkFontfrom tkFont import Font,会直接报 ModuleNotFoundError: No module named 'tkFont'。必须改为:

from tkinter import font

注意:fonttkinter 的子模块,不是独立包,无需 pip 安装。

注册本地字体文件需依赖系统级加载(Tk 不直接支持)

Tkinter 本身不提供类似 font.register_font() 这样的 API 来加载 .ttf/.otf 文件。它只能使用操作系统已安装的字体。所谓“注册本地字体”,本质是让系统识别该字体文件,再通过字体名引用。

  • Windows:双击 .ttf 文件 → “安装”(或复制到 C:\Windows\Fonts
  • macOS:用“字体册”App 安装,或复制到 ~/Library/Fonts/
  • Linux(如 Ubuntu):放入 ~/.local/share/fonts/,然后运行 fc-cache -fv

完成后重启 Python 解释器(Tk 实例需重建),否则新字体不会出现在 font.families() 列表中。

如何确认字体是否可用并正确使用

别靠猜测字体名——不同系统对同一字体文件解析出的家族名可能不同(比如 “Source Han Sans CN” vs “思源黑体 CN”)。务必用 font.families() 实时查:

Python 3.14.3

微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。

from tkinter import font
print(font.families())

返回的是一个元组,包含所有可用字体名(含空格、中文、连字符)。使用时传入 font.Font 构造器即可:

f = font.Font(family="JetBrains Mono", size=12, weight="normal")
label = Label(root, text="code", font=f)
  • family 必须完全匹配 font.families() 中的某一项(区分大小写,但通常不敏感)
  • 如果字体名含空格或特殊字符,不用加引号转义,字符串字面量即可
  • 设置失败时 Tk 不报错,而是静默回退到默认字体(通常是 TkDefaultFont),需肉眼核对效果

动态加载字体的替代方案(仅限 Windows + ctypes)

极少数场景真需要不安装字体就加载(如便携应用),Windows 下可借助 ctypes 调用 GDI+ 的 AddFontResourceEx

import ctypes
from ctypes import wintypes

FR_PRIVATE = 0x10
gdi32 = ctypes.WinDLL('gdi32')
add_font = gdi32.AddFontResourceExW
add_font.argtypes = [wintypes.LPCWSTR, wintypes.UINT, wintypes.LPVOID]
add_font.restype = wintypes.UINT

# 加载当前目录下的字体
add_font("FiraCode-Regular.ttf", FR_PRIVATE, 0)

⚠️ 注意:

  • 该调用只对当前进程有效,退出即失效
  • macOS/Linux 无等效 API,此法不具备跨平台性
  • 仍需等待 Tk 重载字体列表,建议调用后延迟再执行 font.families()
  • 多数生产环境应避免这种 hack,优先走系统字体安装流程

真正卡住的往往不是代码怎么写,而是字体名没对上、系统缓存没刷新、或者误以为 Tk 能像 Pillow 那样直接读取字体文件路径。验证三步走:装字体 → 重启 Python → print(font.families()) 看得到再说。