Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Kivy布局语言中的Keyerror_Android_Python_Kivy - Fatal编程技术网

Android Kivy布局语言中的Keyerror

Android Kivy布局语言中的Keyerror,android,python,kivy,Android,Python,Kivy,我是kivy框架的新手,我认为我没有正确理解kv文件和python之间的id引用是如何工作的。当我用纯python编写此代码时,它按预期工作,但我正在尝试学习使用布局语言。我已经动态生成了分散小部件,需要将它们添加到布局中 在python中 class MainScreen(Screen): def on_enter(self): for index in xrange(numberOfWords): genColor = [255, 0

我是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
画布:
颜色:
rgba:1,1,1,1
矩形:
pos:self.pos
大小:self.size

我在代码行:id:widgetscreen上遇到一个keyerror。

建议的元素链接方式如下所示

千伏:

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


这样,您就可以从
MainScreen
中以
self.widgetscreen
的身份访问
widgetscreen
。您甚至不需要使用
ids

建议的元素链接方式如下所示

千伏:

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

这样,您就可以从
MainScreen
中以
self.widgetscreen
的身份访问
widgetscreen
。您甚至不需要使用
ids

这解决了我的问题

在我最初发布的python中:

from kivy.clock import mainthread
而且

class MainScreen(Screen):
    @mainthread
    def on_enter(self):
id引用没有问题。问题是引用id后正在加载kv文件
@mainthread
使
def on_enter()
等待kv文件加载

这解决了我的问题

在我最初发布的python中:

from kivy.clock import mainthread
而且

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

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

不起作用。获取“ObjectProperty”未定义错误。@SteveHostetler,将
ObjectProperty
添加到导入列表中。(例如,kivy.properties导入ObjectProperty的
)不起作用。获取“ObjectProperty”未定义错误。@SteveHostetler,将
ObjectProperty
添加到导入列表中。(例如,kivy.properties import ObjectProperty中的
)这确实解决了问题,但通常认为这是不符合实际的。在大多数情况下,不鼓励使用
ids
属性。这确实解决了问题,但通常认为这是不符合实际的。在大多数情况下,不鼓励使用
ids
属性。