Ни для кого не секрет, что область применения Python довольно широка: начиная от web-технологий, игровой индустрии и заканчивая проектами NASA. Python работает практически везде: от карманных компьютеров и смартфонов до серверов сети и практически на всех известных платформах, таких как Windows, Linux/UNIX, macOS, Palm OS, Raspberry PI и так далее. Благодаря фреймворку Kivy в 2011 году Python освоил и мобильные платформы в плане разработки приложений под iOS и Android, а в 2015 с помощью библиотеки KivyMD Python научился использовать Material Design.

Библиотека KivyMD — это коллекция виджетов в стиле Material Design, для использования их в кроссплатформенном фреймворке Kivy. В своей предыдущей статье KivyMD — жизнь продолжается, которая была выпущена год назад, я уже рассказывал о форке этой библиотеки, но в issues и в почту часто получал уведомления о том, что заявленые в форке возможности отсутствуют при установке KivyMD из PyPi. И это было действительно так, потому что в PyPi находилась старая версия библиотеки четырехлетней давности из репозитория на GitLab, которая уже не поддерживается автором и, поскольку мы не хотели использовать для своего форка новое имя, типа KivyMD-fork и загружать пакет в PyPi с таким названием, было решено написать автору KivyMD Andres Rodriguez (@mixedCase_) и попросить его удалить свой пакет. После не долгих переговоров Андре дал нам инвайт в Python Package при условии, что он останется соавтором библиотеки. Так что теперь официальный репозиторий библиотеки находится здесь, а в PyPi доступны самые свежие наши обновления.

Итак, какие изменения в библиотеке произошли спустя год? Благодаря тем людям, которые используют KivyMD в своих проектах, мы устранили довольно много ошибок. Сейчас в репозитории 81 закрытый вопрос. Это если не учитывать того, что львиная доля вопросов решается в Discord онлайн чате поддержки пользователей. В нем существует как русскоязычный так и англоязычный разделы. На данный момент реализованы не все спецификации Material Design, потому что над библиотекой работают практически два человека в свободное от работы время. То, что уже реализовано и то, что хотелось бы реализовать можно посмотреть в этом списке. Он далеко не полный, но вы можете его дополнить, так как доступ на редактирование открыт для всех. Вот несколько новых виджетов:

Tooltip


Material Design Tooltip

пример кода
from kivy.lang import Builder
from kivy.factory import Factory

from kivymd.app import MDApp

Builder.load_string('''
#:import random random
#:import hex_colormap kivy.utils.hex_colormap
#:import get_color_from_hex kivy.utils.get_color_from_hex
#:import md_icons kivymd.icon_definitions.md_icons

#:set ICONS list(md_icons.keys())


<IconButtonTooltips@MDIconButton+MDTooltip>


<ExampleTooltips@BoxLayout>
    orientation: 'vertical'

    MDToolbar:
        title: "Example Tooltips"
        md_bg_color: get_color_from_hex(hex_colormap["crimson"])
        elevation: 10
        left_action_items: [['dots-vertical', lambda x: None]]
        tooltip_text: "MDToolbar"

    Screen:

        BoxLayout:
            size_hint: None, None
            size: self.minimum_size
            padding: "10dp"
            spacing: "10dp"
            pos_hint: {'center_x': .5, "center_y": .9}

            IconButtonTooltips:
                icon: random.choice(ICONS)
                tooltip_text: "MDIconButton"
            IconButtonTooltips:
                icon: random.choice(ICONS)
                tooltip_text: "MDIconButton"
            IconButtonTooltips:
                icon: random.choice(ICONS)
                tooltip_text: "MDIconButton"
            IconButtonTooltips:
                icon: random.choice(ICONS)
                tooltip_text: "MDIconButton"
            IconButtonTooltips:
                icon: random.choice(ICONS)
                tooltip_text: "MDIconButton"
            IconButtonTooltips:
                icon: random.choice(ICONS)
                tooltip_text: "MDIconButton"
''')


class Test(MDApp):
    def build(self):
        return Factory.ExampleTooltips()


Test().run()



* пример работы на Mac OS



Bottom App Bar


Material Design Bottom App Bar

Слева — пример работы Bottom App Bar из демо приложения Flutter, справа — демонстрация Bottom App Bar библиотеки KivyMD.

пример кода
from kivy.factory import Factory

from kivymd.app import MDApp
from kivy.lang import Builder


Builder.load_string(
    """
<BottomAppBar@Screen>

    BoxLayout:
        spacing: dp(10)
        orientation: 'vertical'

        MDToolbar:
            title: "Title"
            md_bg_color: app.theme_cls.primary_color
            left_action_items: [['menu', lambda x: x]]

        Widget:

        MDBottomAppBar

            MDToolbar:
                title: "Title"
                icon: "git"
                type: "bottom"
                left_action_items: [["menu", lambda x: x]]
"""
)


class BottomAppBarTest(MDApp):

    def build(self):
        return Factory.BottomAppBar()


BottomAppBarTest().run()


Backdropr


Material Design Backdropr

Слева — пример работы Backdropr из демо приложения Flutter, справа — демонстрация Backdropr библиотеки KivyMD.

Также мы добавили в библиотеке раздел Studies в котором будем размещать демонстрационные приложения, такие как Shrine, Basil и другие. Пока можно посмотреть, как выглядит приложение Shrine:


А вот тоже самое, но из приложения на Flutter:


Так KivyMD выглядит на Android устройствах. В некоторых местах есть, конечно, проблемы с производительностью, но это касается, скорее самого Kivy. Например, все еще есть проблемы со стартом «тяжелых» библиотек. На нижеследующем видео я привел пример приложения использующего OpenCV в качестве бекенда к Android камере:


В конкретно этом случае уже ничего поделать нельзя, потому что при старте подгружаются не только OpenCV и NumPy, но еще и происходят нативные вызовы для того, чтобы все это связать. Однако грамотно спроектированное мобильное приложение на Kivy и KivyMD стартует довольно быстро. Все это касается мобильных платформ. На десктопе таких проблем нет и KivyMD выглядит там просто шикарно:

Mac OS:


Windows:


В принципе, не имеет значения на какой OS все это будет работать, потому что KivyMD, как и Kivy везде выглядит одинаково. Вы сами должны решать, какой вид будет у вашего приложения и я считаю, что это только плюс.

У нас очень много планов, но рук не хватает. Например, пока нет времени доработать файловый менеджер для десктопных систем, хотелось бы внедрить поддержку iOS виджетов и многое другое… Однако несмотря на все недостатки, количество скачиваний и интерес к библиотеке растет с каждым днем:


Присоединяйтесь к сообществу, если вы любите Python также, как любим его мы!

Канал на Youtube
Новости KivyMD
Discord чат

Комментарии (74)


  1. stalker1984
    07.12.2019 06:29

    Спасибо за статью. А не могли бы Вы написать детально о сборке приложения под Андроид?


    1. HeaTTheatR Автор
      07.12.2019 06:34

      Там все настолько просто, что это даже на статью не тянет. Если накоплю материала, который можно подать помимо вашего вопроса, то такая статья будет.


      1. Bloodes
        07.12.2019 10:58

        Я пробовал бульдозером собирать приложение под Андроид на трёх разных платформах и двух разных ноутбуках, и всегда вылезали какие-то ошибки в процессе сборки.


        Долго гуглил ошибки, в итоге так понял, что на винде сборка вообще не работает, а про ту ошибку, которая вылезала у меня на маке contributor местный сказал что не знает как ее исправить.


        Так что это совершенно нетривиальная задача)


        1. HeaTTheatR Автор
          07.12.2019 10:59

          Не буду обещать, но сегодня постараюсь написать о сборке пакета для Андроид.


          1. ADR
            07.12.2019 17:45

            dockerfile в котором всё работает было бы идеально. А то у всех проблемы разные :)


            1. HeaTTheatR Автор
              08.12.2019 01:36

              Был. Удалили. У нас ним тоже были проблемы с Python3. Если у вас есть опыт, поделитесь с нами.


  1. prostomarkeloff
    07.12.2019 13:56

    Всё таки Python не для мобилок. А тот же kivy собирать в APK и тестировать локально — та ещё боль.


    1. HeaTTheatR Автор
      07.12.2019 14:01

      Вы тестируете иначе?


      1. prostomarkeloff
        07.12.2019 14:06

        Немного не это имел ввиду ;) Чтобы какой-нибудь Android Studio заюзать нужно много времени потратить. (имхо, может быть я такой криворукий :( )


        1. HeaTTheatR Автор
          07.12.2019 14:21

          Чтобы какой-нибудь Android Studio заюзать нужно много времени потратить

          Не понимаю, причем здесь Kivy и "та ещё боль"?


          1. prostomarkeloff
            07.12.2019 14:25

            Как минимум скомпилировать в APK =) В мануале по которому я пытался сделать это, использовался Android Studio :thinking:
            Возможно я не прав, но их совместное использование — возможно.


            1. HeaTTheatR Автор
              07.12.2019 14:30

              Kivy не использует для компиляции APK Android Studio. И никогда не использовал.


              1. prostomarkeloff
                07.12.2019 14:33

                Буду знать. Спасибо.


  1. HeaTTheatR Автор
    07.12.2019 14:20

    Чтобы какой-нибудь Android Studio заюзать нужно много времени потратить

    Не понимаю, причем здесь Kivy и "та ещё боль"?


  1. deseven
    07.12.2019 15:02

    В принципе, не имеет значения на какой OS все это будет работать, потому что KivyMD, как и Kivy везде выглядит одинаково. Вы сами должны решать, какой вид будет у вашего приложения и я считаю, что это только плюс.

    Да и правда — в жопу гайдлайны и привычный UX, давайте фигачить свой колхоз везде.


    1. HeaTTheatR Автор
      07.12.2019 17:27

      А разве на Flutter не так? Там UI рендерится так же, как и в Kivy, я думал, что все это знают, на нет...


      1. kuznetsovin
        07.12.2019 18:46

        Не ни также у flutter используются нативные виджеты в отличие от kivy...


        1. kuznetsovin
          07.12.2019 18:49

          В kivy для отрисовки используется opengl соответственно при всем желании вы не получите виджеты нативного вида


          1. HeaTTheatR Автор
            08.12.2019 00:57

            А в приведнных роликах и гифках в статье вы наблюдаете не нативный вид?


            1. kuznetsovin
              08.12.2019 08:52

              По ios хочу увидеть...


        1. bohdan-shulha
          07.12.2019 22:37
          +1

          На самом деле, Flutter использует, если не подводит память, Skia, и все виджеты в нём рисуются этим движком. Тут Kivy концептуально не отличается. А вот ReactNative — напротив, работает с нативным компонентами, но имеет потери производительности из-за наличия Js <> Native бриджа.


        1. RuslanShirkhanov
          07.12.2019 23:18
          +3

          Flutter не использует нативные виджеты ни на одной из платформ. У Flutter свой canvas и движок для рендера в этом canvas. Вот официальная документация — flutter.dev/docs/resources/rendering#introduction


          1. HeaTTheatR Автор
            07.12.2019 23:21

            Так же и Kivy — использует для рендера UI SDL2 и OpenGL… Так что все заявления, типа " Kivy не подходит для мобильных платформ" с таким же успехом применяются и к Flutter!


          1. kuznetsovin
            08.12.2019 09:06

            Да, спасибо был не прав...


  1. viking_unet
    07.12.2019 15:20

    Спасибо за вашу работу! То, что вы делаете — это прекрасно! Но хотелось бы понять две вещи: 1. является ли KivyMD "prodaction ready" (чтобы не переживать за баги в серьёзных приложениях для бизнеса) и 2. когда появится полноценный сайт с документацией? Раньше айтишники по способу усвоения информации делились на два типа — те, кто признают только книги и те, кто читают документацию с ПК. Теперь вот появился третий тип — те, кто учится по youtube роликам. Способ иногда более наглядный, но нет возможности скопировать фрагмент и запустить, а также в напечатанной документации быстрее найти нужный код. Понимаю, что это всё долго и больно, но Вы хотя бы рассматриваете в планах создание документации, мануалов и туториалов?


    1. prostomarkeloff
      07.12.2019 16:01
      -2

      Не думаю, что когда-либо на этом будут что-то более менее серьёзное делать. Для каждой платформы есть свой инструмент.


      1. viking_unet
        07.12.2019 23:32
        +1

        Из минусов kivy — это только размер приложений. Обычно это примерно 20мб. Но сейчас это курам на смех. Из плюсов — любая либа на питон может быть использована в мобильном приложении. У меня был случпй: нужно было найти либы доя трубы, исты и спидтеста. На джаве я этого не нашёл, а вот на питоне — за 1 минуту все либы нашёл, потом внедрил в приложение


        1. HeaTTheatR Автор
          08.12.2019 01:08

          Про размер даже можете не заикаться, ибо посмотрите на размер приложений хотя бы на iOS.


        1. ctc
          09.12.2019 01:14

          Из минусов kivy — это только размер приложений.


          И всё? Прямо даже удивительно слышать. Потому что когда я делал подход к снаряду несколько лет назад, тормозила эта штука в списках с сотней элементов как не в себя. Ну и собрать приложение было практически не реально — мне удалось только с использованием линукс-образа, предоставляемого разработчиками, и только один раз. После чего я поглядел на производительность, на внешний вид (KivyMD тогда уже был, но заставить его работать был тот ещё квест), на документацию, на то, что даже в доступном в гугл-маркете примере некоторые виджеты безбожно глючат (нереагирующая кнопка или пункт меню — милое дело), и пошёл ковырять Android Studio.


          1. HeaTTheatR Автор
            09.12.2019 01:18

            тормозила эта штука в списках с сотней элементов как не в себя

            Сейчас есть RecycleView, который за доли секунды обрабатывает миллионные списки.


            собрать приложение было практически не реально

            https://habr.com/ru/post/479236/


            пошёл ковырять Android Studio

            Идите, ковыряйте


            1. ctc
              09.12.2019 02:57

              Идите, ковыряйте
              Давайте без грубостей. Я вас не оскорблял, так что будьте любезны соблюдать минимум приличий хотя бы из практических соображений — мало что так подрывает усилия евангелиста, как откровенное хамство.


              1. HeaTTheatR Автор
                09.12.2019 12:10

                Покажите в каком месте я вас оскорбил?


                1. ctc
                  09.12.2019 12:28

                  См. цитату в предыдущем сообщении.


                  1. Neikist
                    09.12.2019 12:35

                    Да нет, он вас действительно не оскорблял. Но грубостью и хамством это назвать можно, да.


                    1. ctc
                      09.12.2019 13:06

                      Ничего, он исправился. В смысле — усугубил.


                      1. HeaTTheatR Автор
                        09.12.2019 13:17
                        -1

                        И самое интересное, что мне плевать! На таких, как ты — плевать. А вот тебе бы в чатик заскачить, у школьников троллингу поучиться.


                  1. HeaTTheatR Автор
                    09.12.2019 12:38
                    -1

                    Вы написали, что идете ковырять Студию! Я ответил — "Идите ковыряйте!" Где оскорбление? У доктора давно были? Судя по вашей карме — человек вы с гнильцой!


                    1. ctc
                      09.12.2019 13:01
                      +1

                      Там прямо написано «несколько лет назад», т.е., прямо сейчас я, никуда идти не собирался. Но вам захотелось нахамить, и вы нахамили, поскольку вы узрели еретика, относящегося к продвигаемой вами технологии без подобающего восторга. Теперь начинается «а чо такого». Но тут есть даже положительный момент — вы напомнили мне о ещё об одном минусе kivy: крайне токсичное комьюнити. Никакой критики не воспринимают, их надо строго по шерсти. Я как-то наблюдал у них в группе дискуссию по поводу сломавшего всё и вся релиза — сплошное «it's free so developers owe you nothing». Имеет смысл учитывать этот момент.

                      Судя по вашей карме — человек вы с гнильцой!
                      В гранит!


                      1. HeaTTheatR Автор
                        09.12.2019 13:20
                        -1

                        Мальчик, иди поплачь в чате "никчёмные тролли". Твое рукамашество и ногодрыжество лично меня никоим образом не задевает! Так что подбери слюни с пола!


                      1. HeaTTheatR Автор
                        09.12.2019 13:24
                        -1

                        Это какой нужно быть паскудой, чтобы при отсутствии статей и всего лишь при наличии духста комментариев заработать отрицательную карму?! Да ты прям образец вежливого человека!


                        1. tmnhy
                          09.12.2019 13:25

                          Юра, прекрати мудацкое неадекватное поведение. Ты своим хамством и безосновательным наездом портишь репутацию не себе, а проекту.


                    1. Alesh
                      10.12.2019 14:19

                      Уважаемый, минусиков в карму тут можно наловить усомнившись в непогрешимости Илона Маска например. И это ника не будет зависеть ни от гнильцы, ни от профподготовки. А вам бы успокоиться сейчас.


                      1. HeaTTheatR Автор
                        10.12.2019 14:25

                        Очень странное совпадение, что у вас троих красная карма, нет! Впрочем, мне-то дела нет до ваших сомнений.


                        1. Alesh
                          10.12.2019 15:31

                          Прикольно, а я оказывается когда-то плюсанул тебе в карму)


                          1. HeaTTheatR Автор
                            10.12.2019 15:32

                            И на том спасибо!


                            1. Alesh
                              10.12.2019 17:50

                              Да не за что, хорошее дела делаешь, нервишки только подлечи)


          1. viking_unet
            10.12.2019 10:58

            Да, действительно — и всё. Я собираю приложение на специальной виртуальной машине, предоставленной один из участников сообщества. Показывал первую версию программы широкому кругу лиц в живую. Процесс стал намного проще, чем в Android Stuido. Я тоже слышал страшные истории про бульдозер, киви и извращенцев, собирающих мобилки на питоне. В 2019 году — это всё неправда. Огромнейший плюс подобного подхода — возможность затащить в мобильное приложение ЛЮБУЮ библиотеку на питоне для любых целей, а спектр этих либ и задач намного шире, чем у джавы и даже джаваскрипт. Так что действительно нашёл всего один минус — размер приложения, но 20 МБ по сегодняшним меркам — это не критично))


            1. ctc
              10.12.2019 13:21

              Да, действительно — и всё.
              При этом вы задаёте такие вот вопросы:
              1. является ли KivyMD «prodaction ready» (чтобы не переживать за баги в серьёзных приложениях для бизнеса) и 2. когда появится полноценный сайт с документацией?


            1. HeaTTheatR Автор
              10.12.2019 13:29

              Я не понимаю, что смущает в 20 МБ? На iOS приложения и до 80 МБ вытягивают.


              1. Neikist
                10.12.2019 14:01

                А на андроиде флаттер за 3-4 мегабайта ругают. Текущее приложение над которым с коллегой работаем весит 10-11 мегабайт, и до 20 распухать пока что не планирует.


                1. HeaTTheatR Автор
                  10.12.2019 14:08

                  image


                  1. Neikist
                    10.12.2019 15:51

                    И что это должно было показать?


                    1. HeaTTheatR Автор
                      10.12.2019 15:54

                      То, что размер 20 МБ у приложения Kivy — это не нонсенс.


            1. Neikist
              10.12.2019 14:03

              К моему большому сожалению, основные задачи на мобилках это UI, а с ним у питона все же хуже. Под натив можно почти на любой чих в UI заскоках библиотеку найти.


              1. HeaTTheatR Автор
                10.12.2019 14:09

                а с ним у питона все же хуже

                Например?


                1. Neikist
                  10.12.2019 15:54

                  Зайдите на android arsenal, material.io, полистайте гитхаб — библиотек с разными кастомными вью уже десятки, возможно и сотни, тысяч, да что уж там, думаю со временем доделать один свой эксперимент и еще +1 в эту копилку закинуть, даже с учетом что он не нужен даже мне, но мало ли, пусть будет. Питон все же исторически не про разработку UI, и людей над этим в нем работает меньше.


                  1. HeaTTheatR Автор
                    10.12.2019 15:57

                    И тем не менее, PyQt, wxPython, Kivy, Tkinter существуют и никто бросать их не собирается.


    1. HeaTTheatR Автор
      07.12.2019 18:09

      Рассматривали, конечно. Что-то уже начали делать, но, опять же времени на все и сразу не хватает. В репозитории KivyMD есть раздел wiki. Это, конечно, не сайт с документацией, но там очень много примеров использования с демонстрацией работы. Есть плей-лист на YouTube с уроками по KivyMD, на домашней странице нашего проекта много полезных ссылок. Что касается ошибок… Все критичные ошибки уже исправлены.


  1. tmnhy
    07.12.2019 18:19

    Сравнение с Flutter это прям плюс.
    Но в статье не увидел такой важный момент, а как строится в KivyMD разметка виджетов?

    Например, как по мне, если сравнивать тот же Flutter с React Native, то одно из преимуществ в виджетах Row, Column с определением стиля позиционирования потомков через параметры виджета, по сравнению с Flex-разметкой в CSS-стилях. Упрощает построение составных виджетов.

    Какой подход в KivyMD?


    1. HeaTTheatR Автор
      08.12.2019 01:18

      Разве вы не смотрели под спойлеры? Там приведен код того, что показано на экране.


      1. tmnhy
        08.12.2019 12:41

        Конечно, посмотрел, отсюда и вопрос. И вопрос, не в языке разметки, а в том, что можно им сделать.
        Фишки flex'а и разметки в fluter — это удобное позиционирование элементов главной и поперечной оси.

        Т.е., вместо вопроса на вопрос можно было бы просто ответить, какой подход, flexbox или grid или что-то ещё.


  1. proninyaroslav
    07.12.2019 21:25

    Интересно, превый раз слышу про такой фреймворк. Как я понимаю, Python-код не конвертируется в Java или Objective-C/Swift и исполняется через интерпретатор?


    1. HeaTTheatR Автор
      07.12.2019 23:24

      Чистый Python!


      1. Yuribtr
        08.12.2019 16:25

        Однако, если Kivy написан на Python, то на Андроид устройствах будет выполняться байт-код Java?


        1. HeaTTheatR Автор
          08.12.2019 16:29

          Нет. Будет выполняться байт-код Python.


    1. HeaTTheatR Автор
      07.12.2019 23:39

      Интересно, превый раз слышу про такой фреймворке

      Это очень странно, потому что Kivy старше React Native и Xamarin!
      У первого и у второго богатые папиньки в виде Facebook и Microsoft. Миллионные бюджеты и разрекламированная популярность. У Kivy — 10 000 долларов в год на плату коре-разработчикам фреймворка. Плюс поддержка пользователей. То есть, тупо на добровольных началах. И это уже сейчас затыкает за пояс и Flutter, и ReactNative и Xamarin! Если бы у Kivy был спонсор в виде такого папеньки, как FaceBook, вы бы сейчас и не знали, что такое ReactNative!


      1. proninyaroslav
        08.12.2019 00:24
        +2

        Ну вот так и происходит. Не всегда хорошие технологии популярны, просто потому что нет рекламы.


  1. Stantin
    08.12.2019 19:33

    Да, не очень понятно, с чего Гугл сделал ставку на Котлин, вместо того, чтобы развивать питон


    1. tmnhy
      08.12.2019 19:54

      Всё к чему прикасается гугл, превращается… (можете продолжить сами). То, что они пытались делать на питоне, выглядит, как попытка «превратить его в Java».


      1. Stantin
        09.12.2019 18:14

        Насколько я помню, питон стал популярным как раз с подачи Гугла, когда они стали его интенсивно использовать у себя на сервер- сайде


  1. shadowsokoloff
    09.12.2019 19:56

    Собственно сайт kivy.org не работает


    1. HeaTTheatR Автор
      09.12.2019 19:59

      Работает. Но попал под блокировку Роскомнадзора. VPN в помощь. Хотя у нас в Луганске, например, он спокойно себе работает без всяких VPV:
      image


      1. viking_unet
        10.12.2019 11:03

        Зависит от провайдера. Действительно — у некоторых людей сайт www.kivy.org не открывается. Один мой коллега на вопрос "Почему больше не пользуешься kivy?" ответил как раз, что не пользуется по причине заблокированного сайта, однако он был сильно удивлён, когда я при нём же открыл сайт в рабочем браузере. Но тоже знаю людей, которые до сих пор жалуются на заблокированный сайт.


      1. shadowsokoloff
        11.12.2019 04:30

        Хм. Ок. Спасибо. Не подумал, что может быть заблокирован. Интересна причина блокировки канеш…