Приложение на Android. Python. KivyMD
Раньше я уже писал, что написал для себя полноценное десктопное приложение-менеджер заметок на Python+PyQT5, и в конце намекал на то, что надо бы его "портировать" на Android.
И даже был скрин первого прототипа. Однако, учитывая, что у меня был ужасно слабый (даже для своего времени) ноутбук 2011 года, на котором Android Studio запускалось около 10 минут и ровно столько же билдило приложение. А процесс редактирования был долгим и унылым в силу мощности ноутбука.
Плюс, мне, как для человека, немного разобравшимся с "python for pc", было тяжеловато перейти на разработку под Android. Сама Java, в принципе, вопросов не вызывала, но именно андроид-логика (всякие активити, интенты, передачи из одного окна в другое и получение, и прочее) были для меня тогда ужасно сложным занятием.
Потом мы с другом надумали попробовать на Kotlin (а он тогда только набирал популярность), вроде полегче должно быть. Потом вообще решили переделать полностью, делать типа как веб приложение, хранящие данные в json... Все ради постоянной синхронизации а-ля "Google Keep".
Вариантов было куча.
Но как-то не срослось, к последними я даже не стал приступать. Все-таки мне интересен Python сам по себе. И его универсальность) Вот я и решил проверить эту самую универсальность, и, собственно, себя тоже. Так как это дело было для меня в новинку.
Итак. Есть замечательный фреймворк, который называется Kivy. На их официальном сайте есть документация. Суть в том, что он позволяет писать на Python приложения на другие платформы, в том числе и Android.
И я решил к этому делу приобщиться. Единственное, что смущало - интерфейс. Интерфейс на Kivy уж очень похож на приложения времен Android 4.1(примерно 2012 года).
К примеру , вот демонстрация виджетов.
Свою работу, они, конечно выполняют. Работают на андроиде "нативно". Но... Некрасиво же. 2020 год заканчивается. Android 11 вышел... Концепция Material Design в ходу уже во всем Интернете...
К счастью, решение нашлось. (Много?)страдальный форк библиотеки Kivy, который базируется на ней же, но переделывает ее в современный вид. Как на странно, называется KivyMD (Kivy Material Design). Статьи по ней легко находятся в Интернете. Также у нее вполне понятная документация.
К примеру, так выглядит боковая панель, как в Google Play:
Впечатлившись этим действием, я начал делать первые попытки.
Стоит признать, что не все прошло гладко. Программирование на Kivy состоит из 2 вещей: логика в Python-файле и интерфейс (разметка) в kv-файле. Я же, по привычке, делал все через код. Все, что мог. 90% находится в коде. Впрочем, я ж не на продакшн работаю - для себя) Какая мне разница, лишь бы работало. Моей задачей было максимально быстро перенести программу.
Установив на компьютер все необходимые компоненты, я начал потихоньку все это писать. Основная проблема было лишь правильно указать все зависимости в spec-файле для билдера и настроить виртуалку (для компиляции apk нужен linux). В итоге, вот что из этого получилось.
Каждый раздел находится в отдельном окне, переключение между которыми идет через боковое меню. Каждый экран имеет соответствующие вкладки:
Конечно, боковуха пока довольно некрасива, но пока что я не уделял внимание дизайну, только работоспособности:
При нажатии на имя заметки открывается ее содердимое:
Чекбокс нужен для изменения содержимого заметки:
Ну а в меню архивации собственно есть возможность управления локальными и онлайн-бекапами, все как в десктопной версии:
Вся прелесть в том, что это - все еще код на Python. Т.е. это - идеальный вариант, когда есть готовая программа. Вы просто берете всю свою логику и переносите практически 1 в 1, делая поправку на переписанный интерфейс. Половина работы скошена =)
Например, вот код получения списка всех заметок в папке на PyQT5:
# Функция получения списка всех песен
def all_songs_getnames(self, QWidget, path):
self.path = path
self.object = QWidget
self.object.clear()
for currentFile in self.path.iterdir():
name = os.path.split(currentFile) # разделение пути на адрес и имя файла
base = name[1] # присвоение base имя файла
os.path.splitext(base) # делю остаток на 2 части, отсеиваю расширение с точкой
filename = os.path.splitext(base)[0] # вот и само имя
self.object.addItem(filename)
А вот точно такой же код, только из KivyMD-версии:
def notes_getnames(self, path, widget, iconname):
# удаляем старые
widget.clear_widgets()
# перебираем все файлы и заносим названия в self.list
for currentFile in path.iterdir():
name = os.path.split(currentFile) # разделение пути на адрес и имя файла
base = name[1] # присвоение base имя файла
os.path.splitext(base) # делю остаток на 2 части, отсеиваю расширение с точкой
filename = os.path.splitext(base)[0] # вот и само имя
item = ListItemWithRadiobutton(text=filename, icon=iconname)
item.on_release = partial(self.showtext, path, filename)
widget.add_widget(item)
Конечно, еще есть что допиливать, но главный вывод: python+android=alive!
И это здорово.
Comments