Kivy - 如何使一个对象可以从 Kv 语言子窗口小部件和 Python 窗口小部件的 类 访问?

Kivy - How to make an object accessible from both Kv Language child widgets and Python widget's classes?

我想知道如何从 class 访问实例对象,我已经从我的 Kv 语言子部件和我 Python 中的部件 classes 定义了文件。

如果我在我的应用程序 class 中实例化我的对象,我的 Kv 语言文件可以访问它而我的小部件 classes 不能。但是当我将这个对象设置为全局对象时(在我的应用程序 class 之外),我所有的 classes 都可以访问它,但我的 Kv 语言子部件不会。我制作了以下代码以使其清楚:

我的Python文件:

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.textinput import TextInput

class Person():
    def __init__(self, name):
        self.name = name
    def getName(self):
        return self.name

class MyLayout(BoxLayout):
    def getPerson1Name(self):
        return person1.getName()

person1 = Person('Nik')

class MyApp(App):
    person2 = Person('Jackie')
    def build(self):
        return MyLayout()

if __name__ == "__main__":
    MyApp().run()

我的 Kv 语言 文件:

<MyLayout>:
    BoxLayout:
        orientation: 'vertical'
        Label:
            id: nameDisplay
        Button:
            text: 'Display person1\'s name'
            on_press: nameDisplay.text = root.getPerson1Name()
        Button:
            text: 'Display person2\'s name'
            on_press: nameDisplay.text = app.person2.getName()

如您所见,person1 可以从 MyLayout class 和 person2 来自我的 Kv 语言文件,但是如果我交换这些对象,它将不起作用。有人知道我如何通过这两种媒介制作对象吗?

您可以使用 App.get_running_app():

class MyLayout(BoxLayout):
    def getPerson1Name(self):
        return App.get_running_app().person2.getName()

使用全局变量通常是不好的做法。