Pull to refresh

Comments 46

Спасибо за статью! А можно где-то готовую .apk получить? Я с интересом слежу за Kivy (и Python — это мой любимейший ЯП), но скорость загрузки приложения у него хромала последний раз когда я его пробовал, так что ваша фраза:


Используя в своих проектах библиотеку KivyMD плюс немного фантазии, вряд ли кто-то сможет визуально отличить, написана ли ваша программа на Java или с использованием фрейворка Kivy и Python.

вызывает у меня определённые сомнения в честности всего материала.

Под "вряд ли кто-то сможет визуально отличить" я не имел в виду скорость загрузки приложения, которая в настоящий момент имеет интервал в 4 секунды. apk я не собирал за ненадобностью. Тем более, что сценарий демонстрационного приложения написан на Python 3, для которого сборку установочного пакета под Android я пока не тестировал.

уж простите не тогда это не разработка. Это всё равно что спроектировать красивое здание с красивым видом из окна, а потом вдруг выяснить что здесь копать нельзя, и вообще мы на марс не долетим. БЛин начинать надо всегда с «разведки боем». Т.е. создать минимально возможное но 100% рабочее приложение под среду в которой вы пишите.

Уточните, что вы имеете в виду под "создать минимально возможное" рабочее приложение???

Спасибо за статью! Немного работаю с Киви, но даже не подозревал о подобной библиотеке. Продолжайте писать такие статьи! Особенно на тему Киви :-)
Круто! Спасибо за материал. А под Kivy+iOS есть какие-нибудь статейки?

На просторах Интернета, наверное, есть. Поскольку не имею девайса под iOS, то не интересовался данной темой.

Насколько это юзабельно в продакшене?

Каких-то критичных багов, которые роняют приложение я не наблюдал. Если руки у вас растут из нужного места, ваш проект будет юзабелен так же, как и обычное Java приложение. Но, некоторые находят минусы в большом (от 8 Mb) размере итогового установочного пакета для Android, первоначальную скорость запуска программы, написанной на Kivy… Хотя лично я считаю, что самый большой минус, помимо упомянутых, это невозможность восстановить из трея свернутое приложение. Вам придется программно запоминать (что, кстати, довольно легко) место последнего Activity, который пользователь посещал, чтобы при нажатии иконки в трее ваше приложение запускалось не заново, а с места, в котором оно было свернуто в трей.

Это хорошая новость, спасибо. 8 МБ не критично. Раньше считал, что Киви скорее мертв, чем жив. И смотрел на React Naitive, для реализации мобильного клиента для своего бэкенда (у меня вся кодовая база на Python, будет затратно ее переносить на JS).

Раньше считал, что Киви скорее мертв, чем жив

Kivy поддерживается и развивается разработчиками. KivyMD — тому еще одно доказательство.

Отличная статья. Использую kivy+kivymd для создания программ под windows. Но есть вопрос который меня интересует: насколько много использует kivymd оперативную память? Для примера: пишу читалку книг формата fb2. Строки с книги помещаю в kivy.uix.label, а после в FloatLayout. В книге где 24 страницы памяти берет 160 мб. А когда попытался открыть книгу в 700 страниц — забрало 7.8 гб и так и не открыло…

KivyMD — это библиотека написанная для Kivy и на Kivy. Поэтому потребляемая ею оперативная память зависит от самого Kivy.


Строки с книги помещаю в kivy.uix.label, а после в FloatLayout.

А зачем такой велосипед? Для вашего случая в Kivy существует замечательный виджет RstDocument!

Спасибо за подсказку, стал читать о виджете. Впервые когда, его увидел, подумал, что подходить только к файлам с расширением .rst.
Каждый созданный виджет, естественно, будет память занимать. Вам единовременно нужно держать созданными только виджеты для видимой на экране области книги.
Согласен с Вами о целесообразности такого подхода. Вчера, когда размышлял над ним, возник вопрос: а сколько будет занимать время подгрузка страниц? Плюс к этом, функцию подгрузки нужно вынести в отдельный поток с @mainthread, иначе программа будет зависать на момент подгрузки.
Но, если не один я думаю, что это не плохо, стоит попробовать реализацию и после оценивать. Спасибо.

В Kivy вместо потоков используйте объект Clock!

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

Если посмотреть, как реализованы другие читалки на Android, например, тот же Moon Reader, вы увидите, что пролистывание страниц там не непрерывно, а разделено главами книги: листаем страницы до конца главы, после чего новая глава загружается пару секунд. Возможно, это связано с проблемами, указанными выше.

В таком случае алгоритм будет следующим. Загружаем одну главу из книги в память, создаем для неё соответствующие виджеты. Когда пользователь пролистывает страницы до конца главы (и готов читать следующую) удаляем все виджеты старой главы (память будет очищена сборщиком мусора) и, соответственно, загружаем новую главу, создавая виджеты для неё.

Я не думаю, что даже в главном треде загрузка главы и создание для неё виджетов будет занимать много времени (если глава не на тысячу страниц, конечно). Можно попробовать.
Спасибо за интересную идею. Как Вы подметили, нам не известно сколько в главе может быть страниц — от 1 и до N. Читалку делаю не для Android, а для планшета с Windows 10. Там есть читалка Bookviser Reader и я смотрю на ее производительность. Нет разбивки и подгрузки страниц. Когда я указываю прыжок на произвольную страницу (с 1 на 500) — она думает секунду. Я считаю, это ни сколько подгрузка — сколько перелистывание к нужному виджету. Потому еще рассматриваю вариант с RstDocument.

Ну, и да, как вам правильно подсказывают, если вы пытаетесь загружать в память сразу 700 страниц, то это, по меньшей мере, не правильный подход.

Версия намного старее, чем на гитлабе
Еще одна проблема KivyMD — оно из коробки не умеет динамически создавать тени для виджетов, в итоге недоступны elevation and shadows по гайду MD.

А это что?


image


А вот это?


image


Все работает и доступно. Из коробки!

На самом деле, не совсем. В kitchen_sink тени есть только у card и floating button, и фактически берутся из набора заранее отрисованных *.png файлов со стандартным значением dpi. Подход, мягко говоря, не универсальный. Опять же, отрисованы они не по гайдам…

Ещё момент, в глаза сильно бросаются сгенерированные фреймворком круги. Из-за отсутствия нормального сглаживания приложение выглядит неряшливо. Со шрифтами тоже не всегда все хорошо…

Andrés Rodríguez(автор KivyMD) — молодец, и в одиночку пытается решить главную проблему фреймворка: все приложения, написанные на нем выглядят убого из-за отсутствия «из коробки» красиво оформленных виджетов. Разработчику приходится даже для простых вещей целиком отрисовывать интерфейс, либо довольствоваться тем, что есть. Автор и пишет, что текущая стадия проекта — early alpha, имеется множество детских болезней. Я бы не сказал, что тут 100% «продакшен реди» решение.
Я бы не сказал, что тут 100% «продакшен реди»

Возможно. Но это уже не тот серенький Kivy, каким был раньше. Есть десятки приложений на Java, которые смотрятся гораздо хуже.

В kitchen_sink тени есть только у card и floating button

Разве?


image

Тоже недавно нашел KivyMD. Не похоже, что проект развивается, скорее автор реализовал нужный ему функционал и подзабил — слишком сыро пока.

З.Ы. Что-то моему питону не нравится вш юникод )

D:\dev\python\CreatorKivyProject>python main.py test test
[INFO ] [Logger ] Record log in C:\Users\Merlin\.kivy\logs\kivy_16-10-21_4.txt
[INFO ] [Kivy ] v1.9.1
[INFO ] [Python ] v3.4.4 (v3.4.4:737efcadf5a6, Dec 20 2015, 19:28:18) [MSC v.1600 32 bit (Intel)]
[INFO ] Creator Kivy Project version 0.1.1 ...

[INFO ] \u0421\u043e\u0437\u0434\u0430\u043d\u0430 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 test/test ...
[INFO ] \u0421\u043e\u0437\u0434\u0430\u043d\u0430 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 test/test/data/language ...
[INFO ] \u0421\u043e\u0437\u0434\u0430\u043d\u0430 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 test/test/data/settings ...
[INFO ] \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0442\u043e\u0447\u043a\u0438 \u0432\u0445\u043e\u0434\u0430 main.py ...
[ERROR ] [\u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 - 'charmap' codec can't decode byte 0x81 in position 123] character maps to

Да, есть такое дело… Пользователи Windows, по крайней мере, жаловались. Не знаю, в чем проблема, возможно в том, что я работал в редакторе под Linux… Не имею cистемы Windows в радиусе 10 км, поэтому исправить этот досадный баг не могу, уж извиняйте.

… KivyMD. Не похоже, что проект развивается

Проект развивается. Совсем недавно были добавлены новые виджеты. Я слежу за проектом.

Очень нравится python, но у всех модулей какие-то блокирующие регрессии без определенного срока решения:
— kivy не поддерживает python 3.5
— buldozer ios поддерживает только python 2.7
— pyinstaller игнорирует манифесты
— pyupdater работает только с onefile
— kivymd в перманентной альфе

Как-то очень туманно віглядит возможность нормального использования в продакшне — все время какие-то велосипеды надо изобретать и dirty-хаки делать. Благо в питоне это все сравнительно просто.
kivy не поддерживает python 3.5

Работа над этим уже ведется.


buldozer ios поддерживает только python 2.7

Не знаю, как там в iOS, но сборка установочных пакетов с Python 3.4 уже давно возможна.

К концу серии статей о разработке с Kivy аналога продакшн проекта на Java — такая статья появится.

HeaTTheatR, у меня в контактах 100 человек. Добавьте в ваше приложение в список контактов 100 человек и расскажите как быстро будет он прогружаться. Мгновенно ли появится весь список? Будет ли лаг при отрисовки 100 виджетов.

Причем в списке 1 контакт у вас состоит из 3 лабелов и 2х кнопок и 1ой иконки. То есть 1 контакт из списка это 6 виджетов.
100 контактов — 600 виджетов? Все ли верно?

Да, я предполагал ваш вопрос. В демо приложении к статье список контактов выводится целиком и при размере контакт-листа в сто записей, да, это будет не производительно. Но ведь список контактов можно загружать по одному просто добавляя их в уже существующий MDList путем add_widget. Сейчас исправлю, протестирую, перезалью в репу и выложу гифку с демонстрацией вывода ста контактов.

Оказалось неюзабельным выводить 100 контаков по одному: в этом случае, да, список появляется мгновенно, и растет на глазах, но!.. При этом жутко тормозит весь остальной интерфейс пока список не достигнет своего максимума. Посчитал "голое" время вывода 100 контактов (600 виджетов) — 6 секунд. Много! Было принято решение сделать окно прогресса от момента старта до компоновки всех 100 контактов:



Долго! Ну, и был найден "грязный" хак… От момента начала компоновки 600 виджетов до вывода их на экран проходит секунда!


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

Просто 100 контактов не так много. Если же кажется, что 100 контактов много, то это может быть приложение с заметками. А заметок точно может быть 100. А частенько список чего-либо состоит не из одного виджета, а, как в нашем случае, аж из 6ти каждый.
И тут становится грустно. Приходится колдовать, искать обходные пути. Не каждому хватит энтузиазма.
Я вам прошлый раз приводил пример с файловым менеджером. Там была та же история.
1 файл — это лабел, иконка и контейнер. 30 файлов — 90 виджетов. Вот и ждешь пару секунд, пока прогрузится список из 30 файлов (и это официальный виджет от kivy)

Я вам скажу больше, я на своем компьютере в файловом менеджере жду дольше :)

Kivy вещь классная но, скорость запуска приложения написанного на kivy,
которая связана имхо с развертыванием интерпретатора,
не позволит ему быть когда нибудь в продакшенах.

Развертывание происходит единожды. Все последующие запуски приложения — это старт (мгновенный) сплэша, который пользователь будет созерцать порядка четырех секунд, до момента появления стартового Activity приложения.

kivy уже давно используют в продакшн, например:
https://play.google.com/store/apps/details?id=org.kognitivo.kognitivo
100 тыс. скачиваний, рейтинг 4,3

Тут рассказывается про процесс создания и подводные камни:
http://cheparev.com/kognitivo-challenge-your-brain/
Only those users with full accounts are able to leave comments. Log in, please.