我想知道如何从我从我的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 访问,但如果我交换这些对象,它不会起作用。有人知道我将如何从这两种媒介中获取对象吗?
答案 0 :(得分:3)
您可以使用App.get_running_app():
class MyLayout(BoxLayout):
def getPerson1Name(self):
return App.get_running_app().person2.getName()
使用全局变量通常是不好的做法。