如何在Kivy中更改default_font后更新所有标签的文本属性?

1 投票
1 回答
31 浏览
提问于 2025-04-12 21:21

我该如何在运行时更新我所有的Kivy控件,让它们使用新的default_font(而不需要重启应用)呢?

我在我的Kivy应用中创建了一个设置界面,用户可以选择他们想要的字体。用户在界面上选择完字体后,我就更新了Kivy的配置中的default_font

Config.set('kivy', 'default_font', [font_filename, font_filepath, font_filepath, font_filepath, font_filepath])

当应用重启时,这样做成功地把我所有Kivy标签的默认字体改成了用户选择的字体。

但是,我该如何在运行时,立即在我Kivy应用的所有屏幕上更新所有控件,让它们使用新的字体呢?这一步是在上面提到的Config.set()调用之后进行的。

1 个回答

1

你可以逐个遍历你的组件,然后单独更改它们的字体:

from kivy.app import App
from kivy.config import Config
from kivy.uix.label import Label
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.screenmanager import ScreenManager, Screen

def update_font_recursive(widget):
    if isinstance(widget, Label):
        widget.font_name = Config.get('kivy', 'default_font')[0]
    elif hasattr(widget, 'children'):
        for child in widget.children:
            update_font_recursive(child)

class SettingsScreen(Screen):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        # Create your settings screen layout here
        # ...

    def on_font_selected(self, font_filename, font_filepath):
        Config.set('kivy', 'default_font', [font_filename, font_filepath, font_filepath, font_filepath, font_filepath])
        Config.write()
        update_font_recursive(App.get_running_app().root)

class MainScreen(Screen):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        # Create your main screen layout here
        # ...

class MyApp(App):
    def build(self):
        sm = ScreenManager()
        sm.add_widget(MainScreen(name='main'))
        sm.add_widget(SettingsScreen(name='settings'))
        return sm

if __name__ == '__main__':
    MyApp().run()

撰写回答