Продолжаем серию статей о разработке мобильных приложений с фреймворком Kivy. Сегодня речь пойдет о замечательной библиотеке KivyMD — библиотеке для построения нативного интерфейса в стиле Android Material Design, написанной с использованием и для фреймворка Kivy. Откровенно говоря, лично я бесконечно рад, что отпала необходимость лепить и созерцать кривые, темные и страшные кастомные виджеты в Kivy приложениях. Используя в своих проектах библиотеку KivyMD плюс немного фантазии, вряд ли кто-то сможет визуально отличить, написана ли ваша программа на Java или с использованием фрейворка Kivy и Python.  Скачайте, распакуйте KivyMD, зайдите в корневой каталог распакованного архива и выполните установку: Далее, установите зависимости для KivyMD: После установки библиотеки вы можете запустить тестовый пример из скачанного вами и распакованного архива: После запуска вы увидите приложение, демонстрирующее нативные виджеты и контроллы, которые доступны вам для использования в ваших проектах: В статье мы не будем останавливаться на каких-то конкретных виджетах библиотеки (их создание и параметры прекрасно описаны в том же самом kitchen_sink.py), а создадим простое демонстрационное приложение «Контакты» с использованием KivyMD. Наше приложение будет уметь создавать контакты и группы, а также добавлять в них созданные контакты. Ну, и попутно более детально осветим некоторые аспекты создания интерфейса приложений в Kivy: Для простого создания дефолтного проекта на Kivy рекомендую CreatorKivyProject, детальное описание работы с которым описанно в этой статье. Итак, следуя инструкциям в статье по ссылке, проект DemoKivyContacts создан. Откроем файл по пути DemoKivyContacts/libs/uix/kv/startscreen.kv, безжалостно удалим все его содержимое и «нарисуем» стартовый экран своего приложения! Вот так выглядит разметка данного интерфейса в Kivy-Language: Как видите, наш экран использует:  Эти виджеты библиотеки KivyMD мы импортировали в самом начале файла разметки startscreen.kv: Данные инструкции в Kivy-Language аналогичны импорту в python сценариях: К слову, в kv-файле вы можете включать другие файлы разметки, если интерфейс, например, слишком сложный: У нас имеются две вкладки на MDTabbedPanel — «Контакты» и «Группы». Первая («Контакты») будет содержать виджет ScreenManager (менеджер экранов), в котором мы разместим два, говоря языком Java, Activity: Как вы могли заметить, ScreenManager должен включать один или несколько виджетов Screen (экранов), которые будут содержать наш контент (Activity). В нашем случае это EmptyScreen (пустой экран) и CreateContact (форма создания нового контакта): Переключаться между данными Activity мы будем по их именам: … используя объект ScreenManager... … в программном коде по его идентификатору из созданной нами разметки: … и переключая Activity посредством передачи аттрибуту current имени нового экрана: Теперь «нарисуем» наши Activity — EmptyScreen (пустой экран) и CreateContact (форму создания нового контакта). Создадим файлы разметки интерфейса в директории проекта DemoKivyContacts/libs/uix/kv emptyscreen.kv и createcontact.kv и одноименные python сценарии в директории DemoKivyContacts/libs/uix для управления и передачи параметров созданным виджетам EmptyScreen и CreateContact: emptyscreen.py createcontact.py В EmptyScreen мы использовали еще один виджет из библиотеки KivyMD — MDFloatingActionButton, который стоит описать. Та самая назойливая муха, которую многим пользователям хочется прихлопнуть: В CreateContact используются виджеты библиотеки KivyMD: MDIconButton: MDIconButton — это кнопка с векторной иконкой. Полный набор официальных иконок от Google смотрите по ссылке. Все они используются и доступны в KivyMD. SingleLineTextField: MDFlatButton: Будет вызывать функцию сохранения введенных пользователем данных: Получать введенную пользователем информацию из полей SingleLineTextField мы будем по уже описанному способу выше — по их id из аттрибута text: DemoKivyContacts/libs/uix/kv/createcontact.kv DemoKivyContacts/libs/programclass/showformcreatecontact.py После сохранения данных программа создает список контактов, если он не создан, или добавляет новый к уже существующему списку и выводит его на экран: Обратите внимание на функцию add_screens — программное добавление нового Activity и установка его в качестве текущего экрана: DemoKivyContacts/program.py Я написал небольшую (пока топорную) обвязку для создания списков MDList — DemoKivyContacts/libs/uix/lists.py Создать пункт списка с иконкой слева и векторными иконками справа можно достаточно легко, создав экземпляр класса Lists c нужными параметрами.  Далее список self._contacts_items кидаете на любой требуемый виджет. При создании пункта списка мы передали параметру events_callback функцию _event_contact_item  для обработки событий путнкта: Идентификаторы событий 'call' и 'group' — это имена иконок, которые мы указали в параметре right_icons: DemoKivyContacts/libs/programdata.py При нажатии на иконку звонка откроется экран имитации исходящего вызова: Все виджеты в нем уже описаны, поэтому просто приведу макет разметки данного Activity: Виджет CallContact унаследован от FloatLayout: Это значит, что все виджеты и контроллы в нем будут накладываться друг на друга, отчего в разметке я использовал процентное указание их позиций относительно высоты главного экрана: Теперь, когда вы знаете, как работает ScreenManager, давайте еще раз взглянем на управляющий класс стартового Activity: и скелет разметки: То есть, при нажатии кнопки вызова в пункте списка контактов мы открываем Activity имитации исходящего вызова и закрываем его при нажатии кнопки «Отбой»: Процесс создания группы мы не будем рассматривать, так как он аналогичен процессу создания нового контакта. А остановимся на виджете NavigationDrawer: Для использования панели NavigationDrawer мы должны создать ее разметку и управляющий класс, унаследованный от NavigationDrawer: DemoKivyContacts/program.py На этом пока все. С полным сценарием проекта вы можете ознакомиться на github. Без сомнения библиотека KivyMD является отличным дополнением к фреймворку Kivy! Надеюсь, вы ее освоите и будете применять в своих проектах. У меня есть предложение поменять формат статей о разработке мобильных приложений с помощью Kivy: возьмем уже готовое нативное приложение для Android, написанное на Java и создадим аналогичное, но написанное на Python с использованием фреймворка Kivy, по ходу действия освещая весь процесс разработки с нуля: как создаются виджеты и контроллы в Kivy, как использовать динамические классы, что есть FloatLayout и т.д. Разработчик ПО (мобильные и десктопные системы)