Основой дерева виджетов является «Корневой виджет». Это, по сути, контейнер, в котором находятся дочерние элементы, или виджеты ветки. На приведенном выше рисунке, в корневом виджете – контейнере имеется две ветки («Виджет ветвь 1» и «Виджет ветвь 2»). В свою очередь, каждая из этих веток может иметь свои ответвления. В частности «Виджет ветвь 1», так же является контейнером, в котором находится «Виджет ветвь 1.1». Каждая ветка дерева может иметь «листья». Лист – это конечный элемент в дереве виджетов. Каждый лист – это свойство виджета, которое имеет параметр с заданным значением. Кроме свойства «лист» может содержать и метод, связанный с обработкой события (ссылка на функцию, в которой будет обработано событие, касающееся данного виджета). Структура дерева виджетов может быть сформирована как с использованием языка KV, так и на языке Python.
В приложении может быть только один корневой виджет и любое количество веток, или дочерних виджетов. Виджет представляет собой объект, созданный на базе одного из базовых классов фрейморка Kivy. Базовые классы фрейморка Kivy, на которых можно построить пользовательский объект, можно разделить на две категории:
– классы для создания видимых виджетов (они отображаются в окне приложения);
– классы для создания невидимых виджетов (они указывают положение видимых виджетов в окне приложения).
В литературе можно встретить различное наименование невидимых виджетов: контейнер, макет, виджет позиционирования, виджет Layout.
При построении дерева виджетов на языке KV каждая последующая ветка в программном коде отделяется от предыдущей ветки с помощью отступов. Корневой виджет всегда начинается с первого символа в редакторе программного кода. Каждая последующая ветвь дерева виджетов имеет отступ в 4 символа и начинается с пятого символа в редакторе программного кода. Например:
Корневой виджет:
…… Дочерний виджет 1:
…… …… Дочерний виджет 1.1:
…… Дочерний виджет 2:
…… …… Дочерний виджет 2.1:
…… …… …… Дочерний виджет 2.1.1:
…… …… …… Дочерний виджет 2.1.2:
В редакторе программного кода такой отступ можно создать с использованием клавиши «Tab».
Виджеты в Kivy организованы в виде деревьев. В любом приложении должен быть один корневой виджет, который обычно имеет дочерние виджеты. Дерево виджетов для приложения можно построить и на языке KV, и на языке Python.
На языке Python дерево виджетов можно формировать с помощью следующих методов:
– add_widget (): добавить виджет к родительскому виджету в качестве дочернего;
– remove_widget (): удалить виджет из списка дочерних элементов;
– clear_widgets (): удалить все дочерние элементы из родительского виджета.
Например, если необходимо добавить кнопку в контейнер BoxLayout, то это можно сделать последовательностью следующих команд:
layout = BoxLayout (padding=10) # Создать контейнер
button = Button (text=«Кнопка») # создать кнопку
layout.add_widget (button) # положить кнопку в контейнер
Для демонстрации этой возможности создадим файл с именем K_Treet_1.py и напишем в нем следующий код (листинг 2.50).
Листинг 2.50. Пример создания дерева виждетов на Python (модуль K_Tree_1.py)
# модуль K_Tree_1.py
from kivy. app import App
from kivy.uix.boxlayout import BoxLayout
from kivy. uix. button import Button
from kivy.uix.screenmanager import Screen
class MainApp (App):
…… def build (self):
…… …… scr = Screen () # корневой виджет (экран)
…… …… box = BoxLayout () # контейнер box
…… …… but1 = Button (text=«Кнопка 1») # кнопка 1
…… …… but2 = Button (text=«Кнопка 2») # кнопка 2
…… …… box.add_widget (but1) # положить кнопку 1 в контейнер
…… …… box.add_widget (but2) # положить кнопку 2 в контейнер
…… …… scr.add_widget (box) # положить контейнер в корневой виджет
…… return scr
MainApp().run ()
В этом модуле мы создали корневой виджет scr (экран) на основе базового класса Screen. Затем создали контейнер box на основе базового класса BoxLayout. После этого создали две кнопки but1 и but2 на основе базового класса Button. На следующем этапе эти кнопки положили в контейнер, а сам контейнер поместили в корневой виджет. После запуска данного приложения получим следующий результат (рис.2.41).
Рис. 2.41.Результаты выполнения приложения из модуля K_Treet_1.py
Программный код получился достаточно длинным, поскольку для каждого базового класса приходится делать импорт соответствующего модуля.
Аналогичный код на языке KV будет выглядеть гораздо проще и понятней:
Читать дальше