Как получить доступ к некоторому атрибуту виджета из другого виджета в Kivy?

Хорошо, скажем, я хочу, чтобы эта метка в каком-то виджете использовала текст из метки внутри другого виджета:

<SubWidget@RelativeLayout>:
    Label:
        text: str(root.parent.ids.first.text)

<RootWidget>:
    Label:
        id: first
        center_x: 100
        text: "text"

    SubWidget:
        id: second
        center_x: 200

Это работает, но не кажется хорошим решением. Если я размещу first внутри другого виджета, мне нужно будет изменить ссылку на него везде в коде (это может привести к ошибкам).

Моей первой идеей было хотя бы хранить ссылку на first на корневом уровне и ссылаться на нее:

<SubWidget@RelativeLayout>:
    Label:
        text: str(root.parent.l.text)


<RootWidget>:
    l: first

    Label:
        id: first
        center_x: 100
        text: "text"

    SubWidget:
        id: second
        center_x: 200

Но это приводит к исключению:

AttributeError: 'NoneType' object has no attribute 'text'

Это сбивает с толку, поскольку, если я напишу что-то вроде text: str(root.parent.l), я увижу Label object, а не NoneType.

Итак, у меня есть два вопроса:

  1. Почему второе решение не работает? Как это можно исправить?
  2. В общем, как лучше всего получить доступ к некоторому атрибуту виджета из другого виджета? Могу ли я сделать его независимым от иерархии виджетов?

person Mikhail Gerasimov    schedule 01.10.2016    source источник


Ответы (1)


  1. Свойство объекта l, вероятно, заполняется после первой итерации цикла событий, в то время как вы пытаетесь получить к нему доступ в течение первой. Вы можете отложить его до второй итерации, чтобы заставить его работать.

  2. Самый мощный подход — привязать эти свойства из кода Python, но есть несколько трюков kv lang, чтобы сделать это проще. Это мой любимый метод:

BoxLayout

    Label
        id: label
        text: 'hello world'

    SubWidget
        label_text: label.text

<SubWidget@BoxLayout>
    label_text: 'none'

    Label
        text: root.label_text
person jligeza    schedule 01.10.2016