Kivy возвращает AttributeError: объект «NoneType» не имеет атрибута «bind» при доступе к ListProperty

Я пытаюсь создать экран, отображающий файл изображения, путь которого хранится в ListProperty. Я понимаю, что сообщение об ошибке указывает на то, что Kivy пытается получить доступ к значению до создания ListProperty, но я не знаю, как это исправить.

Вот фрагмент из моего сценария main.py, где свойство инициализируется пустым списком, содержащим одну пустую строку, и вызывается метод сборки:

presentation = Builder.load_file("main.kv")

class MainApp(App):
    image_list = ListProperty([''])

    def build(self):
        return presentation

if __name__ == '__main__':
    MainApp().run()

А вот раздел main.kv, где используется это свойство:

<Screen1>:
    name: 'screen1'
    BoxLayout:
        orientation: 'horizontal'
        Picture:
            source: app.image_string.pop()

Возникшее исключение выглядит следующим образом:

 ...
 BuilderException: Parser: File "main.kv", line 71:
 ...
      69:        orientation: 'horizontal'
      70:        Picture:
 >>   71:            source: app.image_string.pop()
      72:

Любое руководство о том, как это исправить, будет очень признательно. Спасибо!

РЕДАКТИРОВАТЬ Читатель FIns указал, что я вызывал image_string вместо image_list, но даже после внесения исправления я получаю ту же ошибку:

BoxLayout:
    orientation: 'horizontal'
    Picture:
        source: app.image_list.pop()
 BuilderException: Parser: File "main.kv", line 71:

А также ...

 BuilderException: Parser: File "main.kv", line 71:
 ...
      69:        orientation: 'horizontal'
      70:        Picture:
 >>   71:            source: app.image_list.pop()

person DevilsFan    schedule 26.03.2016    source источник
comment
в приложении вы объявили image_list, но использовали image_string в main.kv   -  person hchandad    schedule 26.03.2016
comment
Ой! Ты прав. Я экспериментировал с ListProperty и StringProperty, но это все еще не решает мою проблему. Даже если я исправлю эту синтаксическую ошибку, я получу то же поведение.   -  person DevilsFan    schedule 27.03.2016


Ответы (1)


загрузка языка дизайна kivy внутри метода сборки работает в этом примере:

from kivy.app import App 
from kivy.properties import ListProperty 
from kivy.base import Builder

class MainApp(App):
    image_list = ListProperty([''])

    def build(self):
        presentation = Builder.load_string(""" 
Screen:
    name: 'screen1'
    BoxLayout:
        Image:
            source: app.image_list.pop()
    """)

        return presentation

if __name__ == '__main__':
    MainApp().run()
person hchandad    schedule 26.03.2016
comment
Спасибо Флинс! Я попробую. Я думаю, что в любом случае я бы предпочел поддерживать только один файл, поэтому использование строки сборки, вероятно, лучший способ. - person DevilsFan; 27.03.2016
comment
Спасибо миллион финов!! Я рвал на себе волосы два дня из-за этого, и ваше решение сработало отлично! Я очень ценю вашу помощь в этом. - person DevilsFan; 27.03.2016