Kivy: установить ListProperty от языка KV
Я использую Kivy для создания простого приложения, которое загружало бы разные изображения на разных вкладках панели с вкладками. Все элементы Panel должны вести себя одинаково, но с разными изображениями, поэтому я создал класс виджетов. Я пытаюсь инициализировать свое приложение, используя язык kv, как во многих примерах.
В настоящее время я не могу заставить его работать, потому что не могу найти, как передать имена файлов в списке из языковой части kv в экземпляр виджета. Я могу работать с другими свойствами, но ListProperty поставил меня в тупик.
Вот фрагмент из моего кода:
Builder.load_string("""
<MyMainClass>:
#stuff
TabbedPanelItem:
MyClassLayout:
filenames: ['pic1.jpg', 'pic2.jpg', 'pic3.jpg', 'pic4.jpg']
#other TabbedPanelItems like the one above,
#with different strings in the list
""")
def MyMainClass(TabbedPanel):
pass
def MyClassLayout(FloatLayout):
filenames = ListProperty([])
#rest of my class
Вещи, которые я уже пробовал:
- Используйте разные скобки при назначении списка в части языка kv: я попытался () и {}, а также без скобок.
- Инициализируйте ListProperty по-другому: я уже пытался вставить в него некоторую строку.
- Посылайте разные списки: я пытался посылать числа вместо строк.
В результате всегда получается, что список имен файлов в моем виджете всегда имеет значение по умолчанию. Это будет [] во фрагменте выше, или что я установил в его объявлении в своем классе.
Кто-нибудь, пожалуйста, укажите, что я делаю не так?
Благодарю.
1 ответ
Мне удалось это исправить.
Проблема заключалась в том, что я пытался прочитать списки в конструкторе. Однако они получают свое значение из части kv lang после того, как объект виджета завершил свой конструктор.
В качестве исправления я вызываю метод, который читает список следующим образом:
Clock.schedule_once(self.late_init, 0.02)
Я надеюсь, что люди находят это, и это помогает им.