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 之类的东西,但我无法理解需要在parent1parent2 点中放置哪些变量。我整天都被困在这上面,我希望有人能帮助我理解这里的过程。我怀疑是我缺乏基本的 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_oneMainApp 类中的 python self.root.ids.label_one 访问任何 LabelOne 属性 你可以找到很多解决方案,但这是最好的一个

【讨论】:

感谢您的快速回答。尽管我仍然不太了解技巧 1 在 Kivy 中的实际工作原理,但我能够使用您的第二个技巧和代码示例成功地重组我的主程序。再次感谢!

以上是关于Kivy (MD) - 分离 Kivy 类时如何访问类属性?的主要内容,如果未能解决你的问题,请参考以下文章

Python kivy(kivymd)如何从MD存储和加载数据

如何在 Kivy 语言导入中使用别名?

如何在kivy语言中添加elif语句?

Kivy,根据屏幕名称更改工具栏标题

Python Kivy:在文本输入字段中隐藏虚拟键盘

Kivy:如何在 kivy 中制作圆角 TextInput?