Ни для кого не секрет, что область применения 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)
prostomarkeloff
07.12.2019 13:56Всё таки Python не для мобилок. А тот же kivy собирать в APK и тестировать локально — та ещё боль.
HeaTTheatR Автор
07.12.2019 14:01Вы тестируете иначе?
prostomarkeloff
07.12.2019 14:06Немного не это имел ввиду ;) Чтобы какой-нибудь Android Studio заюзать нужно много времени потратить. (имхо, может быть я такой криворукий :( )
HeaTTheatR Автор
07.12.2019 14:21Чтобы какой-нибудь Android Studio заюзать нужно много времени потратить
Не понимаю, причем здесь Kivy и "та ещё боль"?
prostomarkeloff
07.12.2019 14:25Как минимум скомпилировать в APK =) В мануале по которому я пытался сделать это, использовался Android Studio :thinking:
Возможно я не прав, но их совместное использование — возможно.HeaTTheatR Автор
07.12.2019 14:30Kivy не использует для компиляции APK Android Studio. И никогда не использовал.
HeaTTheatR Автор
07.12.2019 14:20Чтобы какой-нибудь Android Studio заюзать нужно много времени потратить
Не понимаю, причем здесь Kivy и "та ещё боль"?
deseven
07.12.2019 15:02В принципе, не имеет значения на какой OS все это будет работать, потому что KivyMD, как и Kivy везде выглядит одинаково. Вы сами должны решать, какой вид будет у вашего приложения и я считаю, что это только плюс.
Да и правда — в жопу гайдлайны и привычный UX, давайте фигачить свой колхоз везде.HeaTTheatR Автор
07.12.2019 17:27А разве на Flutter не так? Там UI рендерится так же, как и в Kivy, я думал, что все это знают, на нет...
kuznetsovin
07.12.2019 18:46Не ни также у flutter используются нативные виджеты в отличие от kivy...
kuznetsovin
07.12.2019 18:49В kivy для отрисовки используется opengl соответственно при всем желании вы не получите виджеты нативного вида
HeaTTheatR Автор
08.12.2019 00:57А в приведнных роликах и гифках в статье вы наблюдаете не нативный вид?
bohdan-shulha
07.12.2019 22:37+1На самом деле, Flutter использует, если не подводит память, Skia, и все виджеты в нём рисуются этим движком. Тут Kivy концептуально не отличается. А вот ReactNative — напротив, работает с нативным компонентами, но имеет потери производительности из-за наличия Js <> Native бриджа.
RuslanShirkhanov
07.12.2019 23:18+3Flutter не использует нативные виджеты ни на одной из платформ. У Flutter свой canvas и движок для рендера в этом canvas. Вот официальная документация — flutter.dev/docs/resources/rendering#introduction
HeaTTheatR Автор
07.12.2019 23:21Так же и Kivy — использует для рендера UI SDL2 и OpenGL… Так что все заявления, типа " Kivy не подходит для мобильных платформ" с таким же успехом применяются и к Flutter!
viking_unet
07.12.2019 15:20Спасибо за вашу работу! То, что вы делаете — это прекрасно! Но хотелось бы понять две вещи: 1. является ли KivyMD "prodaction ready" (чтобы не переживать за баги в серьёзных приложениях для бизнеса) и 2. когда появится полноценный сайт с документацией? Раньше айтишники по способу усвоения информации делились на два типа — те, кто признают только книги и те, кто читают документацию с ПК. Теперь вот появился третий тип — те, кто учится по youtube роликам. Способ иногда более наглядный, но нет возможности скопировать фрагмент и запустить, а также в напечатанной документации быстрее найти нужный код. Понимаю, что это всё долго и больно, но Вы хотя бы рассматриваете в планах создание документации, мануалов и туториалов?
prostomarkeloff
07.12.2019 16:01-2Не думаю, что когда-либо на этом будут что-то более менее серьёзное делать. Для каждой платформы есть свой инструмент.
viking_unet
07.12.2019 23:32+1Из минусов kivy — это только размер приложений. Обычно это примерно 20мб. Но сейчас это курам на смех. Из плюсов — любая либа на питон может быть использована в мобильном приложении. У меня был случпй: нужно было найти либы доя трубы, исты и спидтеста. На джаве я этого не нашёл, а вот на питоне — за 1 минуту все либы нашёл, потом внедрил в приложение
HeaTTheatR Автор
08.12.2019 01:08Про размер даже можете не заикаться, ибо посмотрите на размер приложений хотя бы на iOS.
ctc
09.12.2019 01:14Из минусов kivy — это только размер приложений.
И всё? Прямо даже удивительно слышать. Потому что когда я делал подход к снаряду несколько лет назад, тормозила эта штука в списках с сотней элементов как не в себя. Ну и собрать приложение было практически не реально — мне удалось только с использованием линукс-образа, предоставляемого разработчиками, и только один раз. После чего я поглядел на производительность, на внешний вид (KivyMD тогда уже был, но заставить его работать был тот ещё квест), на документацию, на то, что даже в доступном в гугл-маркете примере некоторые виджеты безбожно глючат (нереагирующая кнопка или пункт меню — милое дело), и пошёл ковырять Android Studio.HeaTTheatR Автор
09.12.2019 01:18тормозила эта штука в списках с сотней элементов как не в себя
Сейчас есть RecycleView, который за доли секунды обрабатывает миллионные списки.
собрать приложение было практически не реально
https://habr.com/ru/post/479236/
пошёл ковырять Android Studio
Идите, ковыряйте
ctc
09.12.2019 02:57Идите, ковыряйте
Давайте без грубостей. Я вас не оскорблял, так что будьте любезны соблюдать минимум приличий хотя бы из практических соображений — мало что так подрывает усилия евангелиста, как откровенное хамство.HeaTTheatR Автор
09.12.2019 12:10Покажите в каком месте я вас оскорбил?
ctc
09.12.2019 12:28См. цитату в предыдущем сообщении.
Neikist
09.12.2019 12:35Да нет, он вас действительно не оскорблял. Но грубостью и хамством это назвать можно, да.
ctc
09.12.2019 13:06Ничего, он исправился. В смысле — усугубил.
HeaTTheatR Автор
09.12.2019 13:17-1И самое интересное, что мне плевать! На таких, как ты — плевать. А вот тебе бы в чатик заскачить, у школьников троллингу поучиться.
HeaTTheatR Автор
09.12.2019 12:38-1Вы написали, что идете ковырять Студию! Я ответил — "Идите ковыряйте!" Где оскорбление? У доктора давно были? Судя по вашей карме — человек вы с гнильцой!
ctc
09.12.2019 13:01+1Там прямо написано «несколько лет назад», т.е., прямо сейчас я, никуда идти не собирался. Но вам захотелось нахамить, и вы нахамили, поскольку вы узрели еретика, относящегося к продвигаемой вами технологии без подобающего восторга. Теперь начинается «а чо такого». Но тут есть даже положительный момент — вы напомнили мне о ещё об одном минусе kivy: крайне токсичное комьюнити. Никакой критики не воспринимают, их надо строго по шерсти. Я как-то наблюдал у них в группе дискуссию по поводу сломавшего всё и вся релиза — сплошное «it's free so developers owe you nothing». Имеет смысл учитывать этот момент.
Судя по вашей карме — человек вы с гнильцой!
В гранит!HeaTTheatR Автор
09.12.2019 13:20-1Мальчик, иди поплачь в чате "никчёмные тролли". Твое рукамашество и ногодрыжество лично меня никоим образом не задевает! Так что подбери слюни с пола!
HeaTTheatR Автор
09.12.2019 13:24-1Это какой нужно быть паскудой, чтобы при отсутствии статей и всего лишь при наличии духста комментариев заработать отрицательную карму?! Да ты прям образец вежливого человека!
tmnhy
09.12.2019 13:25Юра, прекрати
мудацкоенеадекватное поведение. Ты своим хамством и безосновательным наездом портишь репутацию не себе, а проекту.
Alesh
10.12.2019 14:19Уважаемый, минусиков в карму тут можно наловить усомнившись в непогрешимости Илона Маска например. И это ника не будет зависеть ни от гнильцы, ни от профподготовки. А вам бы успокоиться сейчас.
HeaTTheatR Автор
10.12.2019 14:25Очень странное совпадение, что у вас троих красная карма, нет! Впрочем, мне-то дела нет до ваших сомнений.
Alesh
10.12.2019 15:31Прикольно, а я оказывается когда-то плюсанул тебе в карму)
viking_unet
10.12.2019 10:58Да, действительно — и всё. Я собираю приложение на специальной виртуальной машине, предоставленной один из участников сообщества. Показывал первую версию программы широкому кругу лиц в живую. Процесс стал намного проще, чем в Android Stuido. Я тоже слышал страшные истории про бульдозер, киви и извращенцев, собирающих мобилки на питоне. В 2019 году — это всё неправда. Огромнейший плюс подобного подхода — возможность затащить в мобильное приложение ЛЮБУЮ библиотеку на питоне для любых целей, а спектр этих либ и задач намного шире, чем у джавы и даже джаваскрипт. Так что действительно нашёл всего один минус — размер приложения, но 20 МБ по сегодняшним меркам — это не критично))
ctc
10.12.2019 13:21Да, действительно — и всё.
При этом вы задаёте такие вот вопросы:1. является ли KivyMD «prodaction ready» (чтобы не переживать за баги в серьёзных приложениях для бизнеса) и 2. когда появится полноценный сайт с документацией?
HeaTTheatR Автор
10.12.2019 13:29Я не понимаю, что смущает в 20 МБ? На iOS приложения и до 80 МБ вытягивают.
Neikist
10.12.2019 14:01А на андроиде флаттер за 3-4 мегабайта ругают. Текущее приложение над которым с коллегой работаем весит 10-11 мегабайт, и до 20 распухать пока что не планирует.
Neikist
10.12.2019 14:03К моему большому сожалению, основные задачи на мобилках это UI, а с ним у питона все же хуже. Под натив можно почти на любой чих в UI заскоках библиотеку найти.
HeaTTheatR Автор
10.12.2019 14:09а с ним у питона все же хуже
Например?
Neikist
10.12.2019 15:54Зайдите на android arsenal, material.io, полистайте гитхаб — библиотек с разными кастомными вью уже десятки, возможно и сотни, тысяч, да что уж там, думаю со временем доделать один свой эксперимент и еще +1 в эту копилку закинуть, даже с учетом что он не нужен даже мне, но мало ли, пусть будет. Питон все же исторически не про разработку UI, и людей над этим в нем работает меньше.
HeaTTheatR Автор
10.12.2019 15:57И тем не менее, PyQt, wxPython, Kivy, Tkinter существуют и никто бросать их не собирается.
HeaTTheatR Автор
07.12.2019 18:09Рассматривали, конечно. Что-то уже начали делать, но, опять же времени на все и сразу не хватает. В репозитории KivyMD есть раздел wiki. Это, конечно, не сайт с документацией, но там очень много примеров использования с демонстрацией работы. Есть плей-лист на YouTube с уроками по KivyMD, на домашней странице нашего проекта много полезных ссылок. Что касается ошибок… Все критичные ошибки уже исправлены.
tmnhy
07.12.2019 18:19Сравнение с Flutter это прям плюс.
Но в статье не увидел такой важный момент, а как строится в KivyMD разметка виджетов?
Например, как по мне, если сравнивать тот же Flutter с React Native, то одно из преимуществ в виджетах Row, Column с определением стиля позиционирования потомков через параметры виджета, по сравнению с Flex-разметкой в CSS-стилях. Упрощает построение составных виджетов.
Какой подход в KivyMD?HeaTTheatR Автор
08.12.2019 01:18Разве вы не смотрели под спойлеры? Там приведен код того, что показано на экране.
tmnhy
08.12.2019 12:41Конечно, посмотрел, отсюда и вопрос. И вопрос, не в языке разметки, а в том, что можно им сделать.
Фишки flex'а и разметки в fluter — это удобное позиционирование элементов главной и поперечной оси.
Т.е., вместо вопроса на вопрос можно было бы просто ответить, какой подход, flexbox или grid или что-то ещё.
proninyaroslav
07.12.2019 21:25Интересно, превый раз слышу про такой фреймворк. Как я понимаю, Python-код не конвертируется в Java или Objective-C/Swift и исполняется через интерпретатор?
HeaTTheatR Автор
07.12.2019 23:24Чистый Python!
Yuribtr
08.12.2019 16:25Однако, если Kivy написан на Python, то на Андроид устройствах будет выполняться байт-код Java?
HeaTTheatR Автор
07.12.2019 23:39Интересно, превый раз слышу про такой фреймворке
Это очень странно, потому что Kivy старше React Native и Xamarin!
У первого и у второго богатые папиньки в виде Facebook и Microsoft. Миллионные бюджеты и разрекламированная популярность. У Kivy — 10 000 долларов в год на плату коре-разработчикам фреймворка. Плюс поддержка пользователей. То есть, тупо на добровольных началах. И это уже сейчас затыкает за пояс и Flutter, и ReactNative и Xamarin! Если бы у Kivy был спонсор в виде такого папеньки, как FaceBook, вы бы сейчас и не знали, что такое ReactNative!proninyaroslav
08.12.2019 00:24+2Ну вот так и происходит. Не всегда хорошие технологии популярны, просто потому что нет рекламы.
Stantin
08.12.2019 19:33Да, не очень понятно, с чего Гугл сделал ставку на Котлин, вместо того, чтобы развивать питон
tmnhy
08.12.2019 19:54Всё к чему прикасается гугл, превращается… (можете продолжить сами). То, что они пытались делать на питоне, выглядит, как попытка «превратить его в Java».
Stantin
09.12.2019 18:14Насколько я помню, питон стал популярным как раз с подачи Гугла, когда они стали его интенсивно использовать у себя на сервер- сайде
shadowsokoloff
09.12.2019 19:56Собственно сайт kivy.org не работает
HeaTTheatR Автор
09.12.2019 19:59Работает. Но попал под блокировку Роскомнадзора. VPN в помощь. Хотя у нас в Луганске, например, он спокойно себе работает без всяких VPV:
viking_unet
10.12.2019 11:03Зависит от провайдера. Действительно — у некоторых людей сайт www.kivy.org не открывается. Один мой коллега на вопрос "Почему больше не пользуешься kivy?" ответил как раз, что не пользуется по причине заблокированного сайта, однако он был сильно удивлён, когда я при нём же открыл сайт в рабочем браузере. Но тоже знаю людей, которые до сих пор жалуются на заблокированный сайт.
shadowsokoloff
11.12.2019 04:30Хм. Ок. Спасибо. Не подумал, что может быть заблокирован. Интересна причина блокировки канеш…
stalker1984
Спасибо за статью. А не могли бы Вы написать детально о сборке приложения под Андроид?
HeaTTheatR Автор
Там все настолько просто, что это даже на статью не тянет. Если накоплю материала, который можно подать помимо вашего вопроса, то такая статья будет.
Bloodes
Я пробовал бульдозером собирать приложение под Андроид на трёх разных платформах и двух разных ноутбуках, и всегда вылезали какие-то ошибки в процессе сборки.
Долго гуглил ошибки, в итоге так понял, что на винде сборка вообще не работает, а про ту ошибку, которая вылезала у меня на маке contributor местный сказал что не знает как ее исправить.
Так что это совершенно нетривиальная задача)
HeaTTheatR Автор
Не буду обещать, но сегодня постараюсь написать о сборке пакета для Андроид.
ADR
dockerfile в котором всё работает было бы идеально. А то у всех проблемы разные :)
HeaTTheatR Автор
Был. Удалили. У нас ним тоже были проблемы с Python3. Если у вас есть опыт, поделитесь с нами.