Проверим, как это работает. Изменим приведенный выше программный код следующим образом, файл Metod_Builder2.py (листинг 2.16).
Листинг 2.16. Демонстрация метода Builder Metod_Builder2.py (загрузка кода на KV из текстового файла, расположенного в произвольном месте приложения), модуль Metod_Builder2.py
# модуль Metod_Builder2.py
from kivy. app import App # импорт класса – приложения
from kivy.lang import Builder # импорт метода Builder
# загрузка кода из KV файла
kv_file = Builder. load_file (». /KV_file/main_screen. kv’)
class Basic_Class (App): # определение базового класса
…… def build (self):
…… … … return kv_file
My_App = Basic_Class () # приложение на основе базового класса
My_App.run () # запуск приложения
Здесь мы создали переменную kv_file и, с использованием метода Builder. load_file, загрузили в нее код из файла «main_screen. kv’, который находится в папке проекта KV_file. Теперь создадим папку с именем KV_file, в этой папке сформируем файл с именем main_screen. kv и внесем в него следующий программный код (листинг 2.17).
Листинг 2.17. Текстовый файл (модуль main_screen. kv)
# файл main_screen. kv
Label:
…… text: («Метка из файла./KV_file/main_screen. kv’)
…… font_size: ’16pt’
При запуске данной версии приложения получим следующий результат (рис.2.15).
Рис. 2.15.Окно приложения Basic_Class при наличии файла main_screen. kv
Таким образом, в Kivy реализован второй способ отделение кода с логикой работы приложения от кода с описанием интерфейса. Если использовать данный способ, то – файл с кодом на KV (<���имя файла>.kv) может иметь любое имя и находиться в любой папке приложения.
Выше было упомянуто, что загрузку виджетов можно сделать и из текстовой строки программного модуля, в котором находится базовый класс. Проверим это, напишем программный код для загрузки кода на языке KV из текстовой строки программного модуля с базовым классом (листинг 2.18).
Листинг 2.18. Демонстрация метода Builder (загрузка кода на KV из текстовой строки) модуль Metod_Builder1.py
# модуль Metod_Builder1.py
from kivy. app import App # импорт класса – приложения
from kivy.lang import Builder # импорт метода Builder
# создание текстовой строки
my_str = «»»
Label:
…… text: («Загрузка метки из текстовой строки»)
…… font_size: ’16pt’
«»»
# загрузка кода из текстовой строки
kv_str = Builder. load_string (my_str)
class Basic_Class (App): # определение базового класса
…… def build (self):
…… … … return kv_str
My_App = Basic_Class () # приложение на основе базового класса
My_App.run () # запуск приложения
Здесь мы создали текстовую строку my_str и поместили в нее программный код на языке KV. Затем в переменную kv_str с использованием метода Builder. load_string, загрузили код из строковой переменной my_str. Затем в базовом классе создали функцию def build (self), которая возвращает значение переменной kv_str. Результат работы этого приложения представлен на рис.2.16.
Рис. 2.16.Окно приложения Basic_Class при загрузки метки из текстовой строки
Таким образом, в Kivy реализована возможность не только отделять код с логикой работы приложения от кода с описанием интерфейса, но и совмещать их в рамках одного программного модуля.
Итак, к данному моменту мы установили, что Kivy позволяет создавать элементы интерфейса приложения (виждеты) на языке KV, и либо разделять, либо совмещать программные коды, описывающие интерфейс и логику работы приложения. Еще выяснили, что по умолчанию виджеты располагаются в центре окна приложения и, при изменении размеров окна, перерисовываются автоматически, сохраняя свои пропорции и положение. Это очень важная особенность Kivy, которая обеспечивает адаптацию приложения под размер экрана того устройства, на котором оно запущено.
Интерфейс пользователя в приложениях на Kivy строится на основе виджетов. Виджеты Kivy можно классифицировать следующим образом.
– UX-виджеты, или видимые виджеты (они отображаются в окне приложения, и пользователь взаимодействует с ними);
– виджеты контейнеры или «макеты» (они не отображаются в окне приложения и служат контейнерами для размещения в них видимых виджетов);
– сложные UX-виджеты (комбинация нескольких виджетов, обеспечивающая совмещение их функций);
– виджеты поведения (контейнеры, которые обеспечивают изменение поведения находящихся в них элементов);
– диспетчер экрана (особый виджет, который управляет сменой экранов приложения).
Читать дальше