Kivy中Python代码创建的Button/Label无法动态更新font_size问题
问题原因与解决方案
核心原因
KV语言中设置font_size: container.width/18是动态属性绑定:Kivy会自动监听container.width的变化,一旦容器宽度改变,就会重新计算并更新字体大小。
而你在Python代码中直接写font_size= parent1.width/18只是一次性静态赋值——仅在按钮创建时计算一次当前的宽度值,后续窗口大小变化时,不会自动重新计算更新字体大小。此外你代码里的parent1大概率是笔误,应该对应KV中的container。
解决方案
要让Python创建的控件实现动态字体大小,需要手动为按钮建立container.width与font_size的绑定关系,以下是两种可行方法:
方法1:通过bind方法监听宽度变化(推荐)
利用Kivy的属性绑定机制,监听container.width的变化,实时更新按钮的字体大小。注意使用functools.partial避免循环闭包问题:
from functools import partial from kivy.clock import Clock class ResultScreen(Screen): container = ObjectProperty(None) def __init__(self, **kwargs): super(ResultScreen, self).__init__(**kwargs) Clock.schedule_once(self.setup_scrollview, 1) def setup_scrollview(self, dt): self.container.bind(minimum_height=self.container.setter('height')) def update_btn_font_size(self, button, container, new_width): # 实时更新按钮字体大小 button.font_size = new_width / 18 def afficher_tarifs(self): for i in range(len(tarif_final_ini)): btn_tarif = Button( text=f"Formule {i+1} : {round(tarif_final_ini[i], 2)} €", size_hint_y=None, height=40, disabled=True, bold=True, background_disabled_normal='', background_color=(0, 0, 0, 1), disabled_color=(0.87, 0.16, 0.1, 1) ) # 绑定container宽度变化到当前按钮的字体更新方法 self.container.bind(width=partial(self.update_btn_font_size, btn_tarif)) # 初始化字体大小 btn_tarif.font_size = self.container.width / 18 self.container.add_widget(btn_tarif, index=i)
方法2:自定义带绑定逻辑的控件类
如果需要批量创建这类按钮,可以先在KV中定义自定义按钮的绑定规则,再在Python中实例化:
KV文件添加:
<DynamicFontButton@Button>: font_size: self.parent.width / 18
Python代码修改:
def afficher_tarifs(self): for i in range(len(tarif_final_ini)): btn_tarif = DynamicFontButton( text=f"Formule {i+1} : {round(tarif_final_ini[i], 2)} €", size_hint_y=None, height=40, disabled=True, bold=True, background_disabled_normal='', background_color=(0, 0, 0, 1), disabled_color=(0.87, 0.16, 0.1, 1) ) self.container.add_widget(btn_tarif, index=i)
这样自定义按钮会自动继承KV中定义的动态字体绑定逻辑,无需额外写绑定代码。
内容的提问来源于stack exchange,提问作者Fun Facts
相关产品推荐
相关产品推荐

