Kivy(MD)分离KV类规则定义时如何访问对应类的属性?
问题原因
KV语言中,类规则(即<类名>格式的定义块)内部声明的id仅属于该类实例自身的ids字典,不会被注册到父容器的ids中。你之前直接在LayoutEx下的LabelOne实例上声明id,这个id才会被加入父容器LayoutEx的ids字典,所以可以正常访问;调整写法后id定义在LabelOne的类规则内,LayoutEx的ids里没有对应键,才会抛出属性错误。你查到的嵌套parent访问的思路不适用当前场景。
解决方案(优先推荐第一种)
方案1:实例化时补充id声明
类规则中只放通用属性,在LayoutEx下实例化LabelOne时单独加id即可,原有Python代码无需修改。
调整后的KV文件:
<LabelOne>: text: 'test' halign: 'center' LayoutEx: id: layout_ex LabelOne: id: label_one
仍然可以直接用self.root.ids.label_one.text = 'changed'修改属性。
方案2:遍历子部件匹配类型
如果不想声明id,也可以直接遍历根布局的子部件,匹配LabelOne类型后修改属性,适合布局内只有一个LabelOne实例的场景:
修改on_start方法代码:
def on_start(self): for child in self.root.children: if isinstance(child, LabelOne): child.text = 'changed' break
内容的提问来源于stack exchange,提问作者Wirral
相关产品推荐
相关产品推荐

