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

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

<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 внутри другого виджета, мне нужно будет изменить ссылку на это везде в коде (что может привести к ошибкам).

  • Kivy: компиляция в один исполняемый файл
  • Kivy: Как изменить размер окна?
  • Как я могу обойти ошибку модуля kivy: ImportError: Ошибка загрузки DLL: указанного модуля не удалось найти?
  • Ошибка виджета камеры Python / Kivy с opencv
  • Kivy ObjectProperty для обновления текста ярлыка
  • Kivy ScrollView - не прокрутка
  • Моя первая идея заключалась, по крайней мере, в том, чтобы хранить ссылку 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. В общем, как лучше всего получить доступ к некоторому атрибуту виджета от другого виджета? Могу ли я сделать его независимым от иерархии виджетов?

  • Как получить доступ к id / widget из другого класса из файла kivy (.kv)?
  • Поведение правила Kivy с помощью add_widget ()
  • Ошибка компиляции Android с помощью buildozer
  • Использование класса ObjectProperty
  • Запуск приложения в фоновом режиме
  • Изменение свойства kivy из другого потока
  • One Solution collect form web for “Как получить доступ к некоторому атрибуту виджета от другого виджета в Киви?”

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

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

      BoxLayout
    
         метка
             id: label
             текст: «привет мир»
    
         подвиджет
             label_text: label.text
    
     <Подвиджет @ BoxLayout>
         label_text: 'none'
    
         метка
             text: root.label_text
    
    Python - лучший язык программирования в мире.