
Приветствую!
Не так давно уже писали о Python в Mobile development и разработке мобильных приложений на Python с помощью библиотек Kivy и KivyMD. Эта статья продолжит знакомить вас с кроссплатформенными Python инструментами, а конкретно сегодня мы рассмотрим новинки, которые появились в библиотеке KivyMD за последнее время.
KivyMD — это дополнение к фреймворку Kivy (кроссплатформенный инструмент, ориентированный на разработку современных приложений с поддержкой multitouch), которое предоставляет пользователю набор виджетов «от Google». В кавычках потому, что под капотом KivyMD использует Kivy, который в свою очередь дергает SDL2 и OpenGL ES 2.0 для рендеринга UI, то есть, как и во Flutter, существует свой собственный движок для рендеринга виджетов, а значит все, что вы видите на экране — это не натив. Исключения и споры касательно этого мы решительно оставим в стороне и приступим.
MDDataTable
Итак, в KivyMD последней версии (0.104.1) мы наконец-то внедрили виджет DataTable:

Реализация использования довольно простая:
from kivy.metrics import dp from kivymd.app import MDApp from kivymd.uix.datatables import MDDataTable class Example(MDApp): def build(self): data_tables = MDDataTable( size_hint=(0.9, 0.6), use_pagination=True, # use page pagination for table check=True, # use checkboxes for rows # Data for header columns (name column, width column). column_data=[ ("Desert (100g serving)", dp(70)), ("Calories", dp(30)), ("Fat (g)", dp(30)), ("Carbs (g)", dp(30)), ("Protein (g)", dp(30)), ("Sodium (mg)", dp(30)), ("Calcium (%)", dp(30)), ("Iron (%)", dp(30)), ], # Data for rows. row_data=[ ("Frozen yogurt", "159", "6.0", "24", "4.0", "87", "14%", "1%"), # ..., # ..., ], ) data_tables.open() Example().run()
В DataTable пока реализованы не все функции из Material Design spec DataTables, но мы работаем над улучшениями.
MDDialogs
Было упрощено и улучшено использование диалоговых окон — теперь они соответствуют спецификации материального дизайна.
dialog = MDDialog( title="Reset settings?", text="This will reset your device to its default factory settings.", buttons=[ MDFlatButton( text="CANCEL", text_color=self.theme_cls.primary_color ), MDFlatButton( text="ACCEPT", text_color=self.theme_cls.primary_color ), ], ) dialog.open()

MDCard
В MDCard были добавлены поведения focus_behavior и ripple_behavior:
focus_behavior:
MDCard: focus_behavior: True

ripple_behavior:

MDCard: ripple_behavior: True
MDCardSwipe:

<SwipeToDeleteItem>: size_hint_y: None height: content.height MDCardSwipeLayerBox: MDCardSwipeFrontBox: OneLineListItem: id: content text: root.text _no_ripple_effect: True
class SwipeToDeleteItem(MDCardSwipe): text = StringProperty()

MDTextField
Добавлено текстовое поле с режимом fill:

MDTextField: hint_text: "Fill mode" mode: "fill" fill_color: 0, 0, 0, .4
Во всех классах текстовых полей присутствует возможность установить иконку справа:

MDMenu
Улучшена производительность класса MDMenu.
![]() |
![]() |
TapTargetView
Добавлен виджет TapTargetView:

MDFloatingActionButtonSpeedDial
Внедрили виджет MDFloatingActionButtonSpeedDial:
from kivy.uix.screenmanager import Screen from kivymd.app import MDApp from kivymd.uix.button import MDFloatingActionButtonSpeedDial class Example(MDApp): data = { 'language-python': 'Python', 'language-php': 'PHP', 'language-cpp': 'C++', } def build(self): screen = Screen() speed_dial = MDFloatingActionButtonSpeedDial() speed_dial.data = self.data speed_dial.rotation_root_button = True screen.add_widget(speed_dial) return screen Example().run()

Hot reload
Фреймворк Flutter очень гордится своим инструментом Hot reload (перезагрузка свойств виджетов налету)… В Kivy это было уже давно реализовано. Мы лишь усовершенствовали данную утилиту и включили ее в пакет KivyMD:
И, да, официальная документация KivyMD уже доступна. На этом пока все, спасибо за внимание!


