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)

Я надеюсь, что люди находят это, и это помогает им.

Другие вопросы по тегам