我是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。
答案 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代码中,我们创建了一个MainScreen
,widgetscreen
的类属性,默认为None
。然后,在我们的KV文件中,我们将MainScreen
的属性设置为wdscreen
。在KV lang中,id类似于变量,因此当我们将widgetscreen
设置为wdscreen
时,我们实际上将其设置为我们使用id wdscreen
定义的FloatLayout。在运行时,kivy将使用适当的小部件填充我们的Python属性。
有了这个,您应该可以widgetscreen
内MainScreen
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文件。