爲什麼此代碼從#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才能工作。 –