Приветствую!

Не так давно уже писали о 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 уже доступна. На этом пока все, спасибо за внимание!