Kivy布局语言中的Keyerror

时间:2016-02-03 21:31:35

标签: android python kivy

我是kivy框架的新手,我认为我没有正确理解kv文件和python工作之间的id引用。当我用纯python编写它时,它按预期工作,但我正在尝试学习使用布局语言。我有动态生成的分散小部件,我需要将它们添加到布局中。

在python中。

class MainScreen(Screen):
    def on_enter(self):

        for index in xrange(numberOfWords):
                genColor = [255, 0, 0]
                shuffle(genColor)
                newWordWidget = WordWidget(genColor)
                if newWordWidget.label.color[0] == 255 and  newWordWidget.label.text != 'red': newWordWidget.trash = True
                if newWordWidget.label.color[1] == 255 and  newWordWidget.label.text != 'green': newWordWidget.trash = True
                if newWordWidget.label.color[2] == 255 and  newWordWidget.label.text != 'blue': newWordWidget.trash = True
                print("Trash:" + str(newWordWidget.trash))
                newWordWidget.scatter.pos = randint(0, Window.size[0]), randint(0, Window.size[1])
                self.ids.widgetscreen.add_widget(newWordWidget.scatter)

kv文件:

<FloatLayout>:
ScreenManagement:
    MainScreen:
<MainScreen>:
    FloatLayout:
        id: widgetscreen
        canvas:
            Color:
                rgba: 1, 1, 1, 1
            Rectangle:
                pos: self.pos
                size: self.size

我在线上得到了一个关键词:id:widgetscreen。

2 个答案:

答案 0 :(得分:1)

建议的元素链接方式就是这样的。

KV:

<MainScreen>:
    widgetscreen: wdscreen
    FloatLayout:
        id : wdscreen
        ...

的Python:

from kivy.properties import ObjectProperty # don't forget to add the import

class MainScreen(Screen):

    widgetscreen = ObjectProperty(None)
    ....

让我们来看看这里发生了什么。首先,在Python代码中,我们创建了一个MainScreenwidgetscreen的类属性,默认为None。然后,在我们的KV文件中,我们将MainScreen的属性设置为wdscreen。在KV lang中,id类似于变量,因此当我们将widgetscreen设置为wdscreen时,我们实际上将其设置为我们使用id wdscreen定义的FloatLayout。在运行时,kivy将使用适当的小部件填充我们的Python属性。

有了这个,您应该可以widgetscreenMainScreen self.widgetscreen访问ids。您甚至不需要使用ClientConfiguration clientConfig = new ClientConfiguration(); clientConfig.setSignerOverride("S3SignerType");

答案 1 :(得分:1)

这解决了我的问题。

来自我原来的帖子中的python:

from kivy.clock import mainthread

和...

class MainScreen(Screen):
    @mainthread
    def on_enter(self):

id引用没有错。问题是在引用id之后加载了kv文件。 @mainthread使def on_enter()等待加载kv文件。