在Kivy语言中,可以使用类似
的内容来引用根小部件<RootWidget>:
BoxLayout:
SomeButton:
on_press: print root
但是尝试从Python访问root是不可能的
class SomeButton(Button):
def __init__(self, **kwargs):
super(SomeButton, self).__init__(**kwargs)
self.text = "Button"
self.font_size = 15
def on_press(self, *args):
print root
并将导致
NameError: global name 'root' is not defined
或使用self.root
,
AttributeError: 'SomeButton' object has no attribute 'root'
答案 0 :(得分:11)
如果你想从App获得实际的根小部件,那么我在任何Widget类中使用以下内容......
from kivy.app import App
...
class myWidget(BoxLayout):
app= App.get_running_app()
app.root.whatever-you-want
答案 1 :(得分:5)
在kv文件中,root始终引用带尖括号的父级。因此,您可以在kv文件中引用多个根,具体取决于您在文件中的位置。
# Root here refers to the parent class in angle brackets
<SomeClass>:
BoxLayout:
Label:
text: root.label_text
# and further down in the same kv file, this other
# class is also a root.. here root refers to
# this class
<SomeOtherClass/Widget/LayoutEtc>:
BoxLayout:
Label:
text: root.label_text
然后,在python文件中,这些类可以表示如下:
class SomeClass:
label_text = StringProperty("I'm a label")
def __init__(**kwargs):
super(SomeClass, self).__init__(**kwargs)
b = BoxLayout()
l = Label(text=self.label_text)
b.add_widget(l)
self.add_widget(b)
# now we're set up like the first class in the above kv file
现在看看上面并比较kv文件如何将文本分配给标签,以及如何在上面的python文件中完成。在kv中它是root.label_text
,但在上面,该类使用self
。如同,text=self.label_text
。在添加boxlayout self.add_widget(b)
时也会使用它。 self
是一种引用该类当前实例的方法。
这就是你基本上如何在kv文件中引用'root',但是在python文件中。
如果您不知道为什么使用self
,那么我建议学习python中的类,因为这就是对它的解释所在。
答案 2 :(得分:2)
我的解决方法只是在主要应用的build()
方法中声明一个全局变量,类似于global root
和root = self.root
,因为当你&#39时可以访问根窗口小部件;重新进入App类。您可以使用app
执行相同的操作。
答案 3 :(得分:0)
只是把它拿出来。
家长
Button:
on_press: root.something()
父母的父母:
Button:
on_press: root.parent.something()