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 в первый раз
  • Как центрировать текст по вертикали внутри текстового ввода в файле kv?
  • Простая веб-страница в приложении kivy в виде виджета
  • kivy python, передающий параметры fuction с нажатием кнопки
  • kivy - невозможно получить окно, прервать
  • Какие учебные программы Kivy доступны
  • Kivy: доступ к методу в другом классе
  • Добавление полосы прокрутки в Boxlayout в Киви
  • Это ошибка в Киви? DropDown + ScreenManager не работает должным образом
  • Как добавить модуль в Kivy для Android?
  • Kivy - Plyer - Android - отправка уведомлений, пока приложение не запущено
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.