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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 15:45:34