Kivy: как получить виджет по id (без kv)

Скажем, я определяю на лету в Киви несколько виджетов (кнопок) и динамически назначаю их идентификатор. Я не использую kv-язык в этом прецеденте. Я могу сохранить ссылку на идентификатор виджета, не отслеживая сам виджет: тогда я хотел бы получить доступ к виджету через его идентификатор. Могу ли я сделать что-то вроде «получить виджет по id»? (Если бы я определил виджет в файле kv, я мог бы использовать self.ids.the_widget_id для доступа к самому виджету через свой id)

3 Solutions collect form web for “Kivy: как получить виджет по id (без kv)”

Виджеты Kivy создают древовидную структуру. Дети любого виджета доступны через children атрибут. Если вы хотите, вы можете сохранить ссылку только на корневое окно, а затем перебрать его виджеты с помощью метода walk :

 from kivy.app import App from kivy.uix.boxlayout import BoxLayout from kivy.uix.button import Button class MyWidget(BoxLayout): def __init__(self, **kwargs): super().__init__(**kwargs) button = Button(text="...", id="1") button.bind(on_release=self.print_label) l1 = BoxLayout(id="2") l2 = BoxLayout(id="3") self.add_widget(l1) l1.add_widget(l2) l2.add_widget(button) def print_label(self, *args): for widget in self.walk(): print("{} -> {}".format(widget, widget.id)) class MyApp(App): def build(self): return MyWidget() if __name__ == '__main__': MyApp().run() 

walk() и walk_reverse() были добавлены в kivy.uix.widget.Widget в версии 1.8.1 Kivy. Для более старых версий вам нужно рекурсивно разобрать дерево самостоятельно:

 from kivy.app import App from kivy.uix.boxlayout import BoxLayout from kivy.uix.button import Button class MyWidget(BoxLayout): def __init__(self, **kwargs): super().__init__(**kwargs) button = Button(text="...", id="1") button.bind(on_release=self.print_label) l1 = BoxLayout(id="2") l2 = BoxLayout(id="3") self.add_widget(l1) l1.add_widget(l2) l2.add_widget(button) def print_label(self, *args): children = self.children[:] while children: child = children.pop() print("{} -> {}".format(child, child.id)) children.extend(child.children) class MyApp(App): def build(self): return MyWidget() if __name__ == '__main__': MyApp().run() 

Вы можете получить виджет, используя непосредственно идентификаторы. Например, в вашем коде вы можете изменить текст кнопки следующим фрагментом:

 self.ids.2.ids.3.ids.1.text = '!!!!' 

Вы можете изменить свойства каждого виджета с помощью ids:

 self.ids['order_number'].text='S1212' 
  • Поворот объекта на событие касания в киви
  • Сохранение имени пользователя и пароля для экрана Kivy
  • Python + kivy + SQLite: как использовать их вместе
  • ScreenManager, вложенный внутри BoxLayout, не отображается
  • Kivy: BoxLayout против GridLayout
  • Kivy: получать идентификаторы виджетов и получать доступ к виджетам по уникальному свойству
  • Как скрыть файл кода python и другие связанные файлы в проекте kivy
  • Kivy - привязать текст метки к переменной (только для Python)
  •  
    Interesting Posts for Van-Lav

    WxPython: периодическое заданное значение в TextCtrl не работает

    Python: что такое элегантная идиома для расширения метода с одним или несколькими аргументами ключевого слова?

    Что это за функция import_umath?

    Regexp находит самый длинный общий префикс двух строк

    Как вызвать средство настройки свойств из __init__

    Как обновить Pandas от Anaconda и можно ли использовать eclipse с этим последним?

    Каков наилучший способ загрузки больших списков JSON в Python?

    Каков наиболее эффективный способ перебора списка в python?

    IOError: файл недоступен в Google AppEngine 1.6.1

    Может ли пользовательские команды Django manage.py вернуть значение? Как, а почему нет?

    моделирование движения толпы с помощью matplotlib

    Тип данных Распознавание / Угадание данных CSV в python

    Pyplot – изменить цвет линии, если данные меньше нуля?

    Пользовательская проверка в администраторе Django

    Вычисление ошибок в базах данных с использованием Seaborn FacetGrid

    Python - лучший язык программирования в мире.