为什么此代码从#21行中得到KeyError?为什么不加载BoxLayout中内容的ID? (Kivy)
我试过不同版本的类似代码,但是这是唯一获取KeyError的文件。
要点:https://gist.github.com/Crowbrammer/464ae3ae3ddd7d33a9eb64d856acacd0
为什么失踪每个元素的ID在该Kivy文件?
init()函数下面的函数是如何工作的,它具有完全相同的代码行 - 但init()函数不会?
为什么此代码从#21行中得到KeyError?为什么不加载BoxLayout中内容的ID? (Kivy)
我试过不同版本的类似代码,但是这是唯一获取KeyError的文件。
要点:https://gist.github.com/Crowbrammer/464ae3ae3ddd7d33a9eb64d856acacd0
为什么失踪每个元素的ID在该Kivy文件?
init()函数下面的函数是如何工作的,它具有完全相同的代码行 - 但init()函数不会?
我不认为record_new_model
被调用。
你的构造函数失败了,所以其余的并不重要。
您没有正确设置标识。
你需要做这样的事情
<ModelAddLayout>:
model_add_name: model_add_name
orientation: 'vertical'
padding: 20, 20
Label:
id: title_label
text: 'Model Add Screen'
font_size: '30dp'
# text_size: '15dp'
TextInput:
id: model_add_name
text: 'Add your model name here'
multiline: False
当你添加一个ID它不会添加到父一个孩子。您还需要将该ID添加到父级:model_add_name: model_add_name
。
根决定首先将哪些元素加载到代码中。
对于此代码是ScreenManagement。其他人的根是ModelAddLayout。
因此,对于我链接的代码,它会比我预期的更晚加载kv文件的元素,因此在ids属性中没有键可调用。然后,我所做的工作就是将super()以外的所有东西放入新函数late_init(self,keys,** largs)中。
之后,我把Clock.schedule_once(self.late_init,0)init()的超级。
这给了应用程序时间来填充id,使我的下拉列表成为现实。
(从评论到Radu Dita的回答。)
恐怕不是这样。我已经成功地调用了过去没有初始化id的子id。它与其他代码一起工作的原因,而不是这个与根有关。根决定首先将哪些元素加载到代码中。对于这个代码是ScreenManagement。其他人的根是ModelAddLayout。因此,对于我链接的代码,它会比我预期的更晚加载kv文件的元素,因此,不需要调用ids属性中的任何键。 –
我试过你的建议,顺便说一句。我不只是把它擦掉。我所做的工作是将除super()之外的所有东西都放入一个新函数late_init(self,keys,** largs)中。之后,我在__init __()的超级后面放置了Clock.schedule_once(self.late_init,0)。这给了应用程序时间来填充ID,使我的下拉列表成为现实。 –
是的,有时候会发生。如果您想要添加小部件的确切时刻,您可以在控制器类中实现on_model_add_name。每当widget_id的值发生变化时,Kivy都会为您调用名为on_widget_id的方法。我认为你需要将widget_id定义为ObjectProperty才能工作。 –