我怎样才能从Python引用Kivy的Root Widget?

时间:2015-08-23 00:53:40

标签: python-2.7 kivy

在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'

4 个答案:

答案 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 rootroot = self.root,因为当你&#39时可以访问根窗口小部件;重新进入App类。您可以使用app执行相同的操作。

答案 3 :(得分:0)

只是把它拿出来。

家长

Button:
  on_press: root.something()

父母的父母:

Button:
  on_press: root.parent.something()