Kivy (MD) - 分离 Kivy 类时如何访问类属性?
Posted
技术标签:
【中文标题】Kivy (MD) - 分离 Kivy 类时如何访问类属性?【英文标题】:Kivy (MD) - How do you access class properties when you separate the Kivy classes? 【发布时间】:2021-10-25 21:56:02 【问题描述】:如果我的术语混淆了,我们深表歉意。我把这个例子放在一起来说明我的问题。我想访问标签的文本属性,我把它放在 LabelOne 类中。使用 .py:
from kivy.lang import Builder
from kivymd.app import MDApp
from kivymd.uix.boxlayout import MDBoxLayout
from kivymd.uix.label.label import MDLabel
class LabelOne(MDLabel):
pass
class LayoutEx(MDBoxLayout):
pass
class MainApp(MDApp):
def build(self):
self.theme_cls.theme_style = 'Light'
self.theme_cls.primary_palette = 'Blue'
return Builder.load_file('figure_out_ids.kv')
def on_start(self):
self.root.ids.label_one.text = 'changed'
if __name__=='__main__':
MainApp().run()
我使用on_start
方法访问标签的文本属性。
现在,当我像这样构造我的 .kv 代码时:
LayoutEx:
id: layout_ex
LabelOne:
id: label_one
text: 'test'
halign: 'center'
on_start
方法完美运行,我能够在 python 中操作 label_one.text。
但是,我真正想做的是将 .kv 文件中的 LabelOne 类分开并这样写:
<LabelOne>:
id: label_one
text: 'test'
halign: 'center'
LayoutEx:
id: layout_ex
LabelOne:
并且仍然可以从MainApp
on_start
方法调用标签,但这会给出:AttributeError: 'super' object has no attribute '__getattr__'
错误。现在环顾互联网,我知道我必须将self.root.ids.label_one.text = 'changed'
更改为self.parent1.parent2.ids.label_one.text
之类的东西,但我无法理解需要在parent1
和parent2
点中放置哪些变量。我整天都被困在这上面,我希望有人能帮助我理解这里的过程。我怀疑是我缺乏基本的 Python 知识导致了这个问题。提前非常感谢您!
【问题讨论】:
【参考方案1】:在 kivy 中没有任何东西 self.parent1.parent2.
你可以使用 parent.parent.... 直到你到达所需的小部件
这种情况的最佳解决方案是将 LabelOne
的 id 放在根小部件中,您可以像这样将所有其他 LabelOne
属性放在 LabelOne 类中
<LabelOne>:
text: 'test'
halign: 'center'
LayoutEx:
id: layout_ex
LabelOne:
id: label_one
然后您可以使用 kv 文件中的 python app.root.label_one
和 MainApp
类中的 python self.root.ids.label_one
访问任何 LabelOne 属性
你可以找到很多解决方案,但这是最好的一个
【讨论】:
感谢您的快速回答。尽管我仍然不太了解技巧 1 在 Kivy 中的实际工作原理,但我能够使用您的第二个技巧和代码示例成功地重组我的主程序。再次感谢!以上是关于Kivy (MD) - 分离 Kivy 类时如何访问类属性?的主要内容,如果未能解决你的问题,请参考以下文章