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

Kivy修改default_font后,如何在运行时更新所有控件字体?

在Kivy运行时立即更新所有控件的字体

修改Config.set('kivy', 'default_font')后,Kivy不会自动刷新已创建控件的字体——因为这些控件在初始化时已经加载了旧字体。要实现运行时即时更新,需要结合配置保存、字体重新注册、控件遍历更新三个步骤:

步骤1:更新并保存配置

先修改Config并写入文件,确保重启应用时配置生效:

from kivy.config import Config

# 用户选择的字体参数
font_filename = "my_custom_font"
font_filepath = "/绝对路径/到/你的字体文件.ttf"

# 设置默认字体(列表格式:[字体名, 常规体路径, 粗体路径, 斜体路径, 粗斜体路径])
Config.set('kivy', 'default_font', [font_filename, font_filepath, font_filepath, font_filepath, font_filepath])
Config.write()  # 保存到配置文件

步骤2:重新注册字体

Kivy会缓存已注册的字体,需要先卸载旧的默认字体,再注册新字体:

from kivy.core.text import LabelBase

# 获取旧的默认字体名称
old_font_info = Config.getprevious('kivy', 'default_font')
old_font_name = old_font_info[0] if isinstance(old_font_info, list) else old_font_info.split(',')[0]

# 卸载旧字体
LabelBase.unregister(name=old_font_name)

# 注册新字体
LabelBase.register(
    name=font_filename,
    fn_regular=font_filepath,
    fn_bold=font_filepath,
    fn_italic=font_filepath,
    fn_bolditalic=font_filepath
)

步骤3:遍历所有控件更新字体

递归遍历应用的所有控件,更新font_name属性并触发纹理刷新:

from kivy.app import App

def update_all_widget_fonts(widget, target_font_name):
    # 检查控件是否有font_name属性
    if hasattr(widget, 'font_name'):
        widget.font_name = target_font_name
        # 触发控件纹理更新(比如Label需要重新渲染文本)
        if hasattr(widget, 'texture_update'):
            widget.texture_update()
    
    # 递归处理子控件
    for child in widget.children:
        update_all_widget_fonts(child, target_font_name)

# 获取当前运行的应用实例,传入根控件和目标字体名
app = App.get_running_app()
update_all_widget_fonts(app.root, font_filename)

特殊控件处理

  • RecycleView:动态生成的子项需要刷新适配器,比如重置data属性触发重新渲染:
    rv = app.root.ids.your_recycleview_id
    rv.data = rv.data  # 触发子项重新生成,自动使用新字体
    
  • 自定义控件:如果自定义控件内部嵌套了Label等控件但未暴露font_name,需要在自定义控件中添加字体更新方法,或者确保内部控件继承父控件的字体属性。

注意事项

  • 确保字体文件路径正确,优先使用绝对路径避免找不到文件;
  • 后续新创建的控件会自动使用新字体,无需额外处理;
  • 部分控件(如TextInput)同样支持font_name属性,上述遍历函数会自动处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 06:42:44