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

Python+Kivy动态设置文本报错:'super'对象无__getattr__属性

Kivy ScrollView动态设置Label文本报错解决办法

报错原因

在Screen的__init__方法里直接访问self.ids.movelist_label会失败——kv文件中的部件是在父类初始化完成后才逐步创建的,刚进入__init__时,目标Label还没被添加到self.ids字典中,自然找不到对应部件。

解决方法一:延迟执行设置逻辑

用Kivy的Clock.schedule_once把设置文本的操作延迟到下一帧,等所有部件加载完成后再执行:

from kivy.clock import Clock

class FeedbackWindow(Screen):
    def __init__(self, **kw):
        super().__init__(**kw)
        self.moves = ""
        for move in dance[0]:
            self.moves += move + "\n"
        # 延迟一帧执行,确保Label已创建
        Clock.schedule_once(self._set_movelist_text)

    def _set_movelist_text(self, dt):
        self.ids.movelist_label.text = self.moves

解决方法二:利用kv加载完成回调

Kivy提供了on_kv_post方法,会在当前屏幕的kv代码加载完成后自动触发,适合用来做部件初始化:

class FeedbackWindow(Screen):
    def __init__(self, **kw):
        super().__init__(**kw)
        self.moves = ""
        for move in dance[0]:
            self.moves += move + "\n"

    def on_kv_post(self, base_widget):
        # kv加载完成,Label已存在
        self.ids.movelist_label.text = self.moves

额外优化:让Label显示全内容

当前Label高度固定为48sp,文本过多会被截断,修改为根据文本内容自动计算高度:

修改kv代码中的Label部分:

Label:
    id: movelist_label
    size_hint_y: None
    height: self.texture_size[1]  # 跟随文本实际高度调整
    text: "Temp text"

关于kv绑定的正确用法

之前尝试text: root.moves无显示,是因为moves是普通变量,Kivy无法监测其变化。将它声明为Kivy的StringProperty即可:

Python代码修改:

from kivy.properties import StringProperty

class FeedbackWindow(Screen):
    moves = StringProperty("")  # 声明为可观测属性

    def __init__(self, **kw):
        super().__init__(**kw)
        move_content = ""
        for move in dance[0]:
            move_content += move + "\n"
        self.moves = move_content

kv代码修改:

Label:
    id: movelist_label
    size_hint_y: None
    height: self.texture_size[1]
    text: root.moves  # 绑定到Screen的moves属性

这样不仅能正常显示文本,后续self.moves变化时,Label内容还会自动更新。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 19:52:24