建立Root Widget /以app.root身份访问它?

时间:2015-02-15 23:00:49

标签: python python-3.x kivy

在下面的文件中将“MyKivyRoot”设置为我的根小部件时,我错过了哪些步骤?

我的印象是.kv文件中的顶部/最左侧窗口小部件会自动被视为根窗口小部件。但显然我错过了一些必要的步骤。

使用“app.root.show_text()”似乎没有指向正确的位置(我得到一个“'NoneType'对象没有属性'show_text'”错误)。

但是我可以从< MyKivyRoot>阻止使用“root.show_text()”

我忘记在这做什么?

这是我的'main.py'的简化版本:

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

class MyKivyRoot(BoxLayout):
    def show_text(self):
        return "Here is your text"

class NewClass(BoxLayout):
    pass

class MyKivyApp(App):
    pass

if __name__ == '__main__':
    MyKivyApp().run()

这是'MyKivy.kv'

MyKivyRoot:

<MyKivyRoot>:
    Label:
        text: root.show_text()
    NewClass

<NewClass>:
    Label:
        text: app.root.show_text()

我一直在使用“使用Kivy创建应用程序”一书,并且书中的代码没有任何问题(我有使用PySide的经验)。但是当我尝试自己进行实验时,我立即被这个基本的(我假设的)问题困住了。据我所知,我的内容与本书中的(工作)代码完全相同,但很明显我有一些东西可以忽略。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

您需要返回根小部件。

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder

kv = '''
<MyKivyRoot>:
    Label:
        text: root.show_text()
    NewClass

<NewClass>:
    Label:
        text: app.root.show_text() if app.root else ''

# The first two just define classes, they don't create instances:
MyKivyRoot:
# This does
'''


class MyKivyRoot(BoxLayout):
    def show_text(self):
        return "Here is your text"


class NewClass(BoxLayout):
    pass


class MyKivyApp(App):
    def build(self):
        return Builder.load_string(kv)


if __name__ == '__main__':
    MyKivyApp().run()