Kivy - 如何使用Kv Language子窗口小部件和Python窗口小部件类来访问对象?

时间:2015-07-08 15:29:50

标签: python kivy

我想知道如何从我从我的Kv语言子窗口小部件和我的Python文件中的窗口小部件类定义的类中访问instace对象。

如果我在App的类中实例化我的对象,我的Kv语言文件可以访问它而我的小部件类不能访问它。但是当我将这个对象设置为全局(在我的App的类之外)时,我的所有类都访问它,但是我的Kv Language子窗口小部件却没有。我做了以下代码清楚地说明了:

我的 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 可以从我的Kv语言文件中的 MyLayout 类和 person2 访问,但如果我交换这些对象,它不会起作用。有人知道我将如何从这两种媒介中获取对象吗?

1 个答案:

答案 0 :(得分:3)

您可以使用App.get_running_app()

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

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