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
相关产品推荐
相关产品推荐

