python 是否正在建立根控件/以app.root身份访问它?

u5rb5r59  于 2023-01-08  发布在  Python
关注(0)|答案(2)|浏览(103)

在下面的文件中将"MyKivyRoot"设置为我的根窗口小部件时,我遗漏了哪些步骤?
我的印象是. kv文件中最上面/最左边的小部件会自动被当作根小部件,但显然我错过了一些关键步骤。
Using "app.root.show_text()" doesn't seem to point to the right place (I get a "'NoneType' object has no attribute 'show_text'" error).
But I CAN access the method from within the < MyKivyRoot > block using "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()

这是我的Kivy.kv

MyKivyRoot:

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

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

我一直在研究《用Kivy创建应用程序》这本书,书中的代码没有任何问题(我有使用PySide的经验)。但当我试图自己进行实验时,我马上就被这个基本的(我假设的)问题难住了。据我所知,我的布局与书中的(工作)代码完全相同,但显然我忽略了一些东西。
任何帮助将不胜感激!

axzmvihb

axzmvihb1#

您需要返回一个根部件。

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()
yqkkidmi

yqkkidmi2#

您需要在根小部件声明中声明子小部件。尖括号表示法用于定义小部件,但它们也必须声明。用户定义的变量必须在小部件定义中声明,以便它们可以作为小部件声明的参数传递。

#untitled.kv#

Screen:
    FooWidget:
        name: 'World'
        size_hint: 1, .5
        pos_hint: {'top': 1}
    BarWidget:
        color: 1, .5, 0
        size_hint: 1, .5
        pos_hint: {'y': 0}

<FooWidget@Label>:
    name: ''
    text: f'Hello, {self.name}'

<BarWidget@Widget>:
    color: 0, 0, 0
    canvas.before:
        Color: 
            rgb: root.color
        Rectangle:
            pos: root.pos
            size: root.size

-------------------------------------
#untitled.py#

from kivy.app import App

class UntitledApp(App):
    pass

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

相关问题