如何在Kivy中更改default_font后更新所有标签的文本属性?
我该如何在运行时更新我所有的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()