Python фреймворк для android

Фреймворки Python для геймдева и мобильной разработки

В этой статье мы рассмотрим полезные фреймворки Python для создания игр и приложений для мобильных устройств. Некоторые из этих фреймворков также поддерживают десктопные приложения или работают как автономные инструменты для сборки как для десктопных, так и для мобильных устройств. Благодаря этому вы можете использовать одну кодовую базу (с небольшими изменениями) для развертывания приложений на различных устройствах.

Kivy — это бесплатный фреймворк для создания приложений и игр. Имеет открытый исходный код. Kivy позволяет разрабатывать приложения и 2D-игры, совместимые с десктопными и мобильными устройствами. Лицензия фреймворка позволяет создавать приложения для коммерческих целей.

Основные особенности Kivy:

  • поддержка мультитач-ввода,
  • аппаратное ускорение графического интерфейса
  • множество предопределенных GUI-виджетов
  • пользовательские виджеты
  • собственный уникальный язык дизайна «kv», подходящий для быстрого прототипирования
  • возможность создавать пакеты для десктопных операционных систем и мобильных устройств, таких как Android и iOS.

Подробную документацию по Kivy можно почитать здесь. Kivy был разработан для многих дистрибутивов Linux. Его пакеты можно найти в дефолтных репозиториях с помощью диспетчера пакетов. Также вы можете получить последнюю версию Kivy, следуя инструкциям, доступным здесь.

BeeWare

BeeWare – еще один отличный бесплатный фреймворк с открытым исходным кодом, предназначенный для разработки приложений. По сути, он работает согласно концепции «написать один раз – развернуть везде». Вы можете использовать одну и ту же кодовую базу для создания и десктопных, и мобильных приложений.

Кроме того, приложения, разработанные с использованием BeeWare, хорошо интегрируются с разными платформами, сохраняя нативный внешний вид, характерный для платформы.

BeeWare также имеет довольно простые условия лицензирования, поэтому вы можете использовать его для коммерческих проектов.

Основные функции BeeWare включают:

  • API для доступа к нативным виджетам графического интерфейса,
  • API для доступа к библиотекам, специфическим для конкретных платформ
  • возможность развертывания приложений на нескольких платформах.

Вы можете получить доступ к документации BeeWare здесь. Подробные инструкции по установке доступны здесь.

Pyqtdeploy

Pyqtdeploy, в отличии от Kivy и BeeWare, не является фреймворком для разработки приложений. Он предоставляет набор инструментов, позволяющих упаковать приложение PyQt для различных платформ, включая мобильные устройства.

Pyqtdeploy также может упаковывать приложения с графическим интерфейсом, CLI-приложения, а также библиотеки. Его также можно использовать для создания пакетов для Python-приложений , которые не используют библиотеки PyQt. Pyqtdeploy находится под лицензией BSD, что позволяет нам использовать его в коммерческих проектах.

Чтобы узнать больше о методах упаковки Pyqtdeploy и процессе развертывания, просмотрите онлайн-документацию, которая доступна здесь. Подробные инструкции по установке можно найти здесь.

Python-for-android

Python-for-android или p4a – это набор инструментов, которые можно использовать для создания Python-приложений для платформы Android.

Этот фреймворк имеет надежный набор инструментов для сборки, позволяющий создавать файлы «apk», которые вы можете опубликовать в Play Store.

Python-for-android в основном разрабатывался как упаковочная утилита для приложений Kivy. Однако теперь он значительно вырос и позволяет упаковывать и другие приложения на основе Python.

Основные функции Python-for-android включают поддержку создания пакетов для нескольких архитектур, рецепты сборки, поддержку упаковки приложений, разработанных с использованием библиотек SDL2, и многое другое.

Вы можете узнать больше о методах упаковки здесь. Инструкции по установке доступны здесь.

Ren’Py

Ren’Py – это ещё один бесплатный инструмент с открытым исходным кодом, который можно использовать для разработки визуальных романов как для компьютеров, так и для мобильных устройств (Android и iOS).

Читайте также:  Мусульманские стикеры для ватсап андроид

Основанный на Python, Ren’Py имеет графический инструмент управления проектами. Также в нем можно найти утилиты командной строки для разработки собственных игр. Более того, вы можете использовать данный инструмент для создания различных симуляторов и ролевых игр при помощи встроенной системы сценариев.

К другим основным функциям Ren’Py можно отнести API управления активами и API диалоговых скриптов. Кроме того, он поддерживает «мультитач», автосохранение и быструю перемотку вперед, перемотку и пропуск сцен, предопределенные и настраиваемые анимацию и переходы и т. д.

Официальная документация по Ren’Py доступна здесь. Вы можете установить его на свой компьютер, следуя инструкциям, которые можно найти здесь.

Заключение

Python – чрезвычайно универсальный язык программирования с огромной библиотекой встроенных модулей. Его можно использовать для разработки приложений практически под любой тип требований, для любой области. К сожалению, в сфере мобильной разработки Python не очень популярен. Здесь он не достигает тех высот, которые доступны другим языкам. Фреймворков Python для создания игр и мобильных приложений очень мало. Но все же они есть. И именно о них мы рассказали в сегодняшней статье.

Источник

Разработка игры под Android на Python на базе Kivy. От А до Я: подводные камни и неочевидные решения. Часть 1

Некоторое время тому назад я решил попробовать написать что-то на Python под Android. Такой странный для многих выбор обусловлен тем, что я люблю Python и люблю Android, а ещё люблю делать необычное (ну хорошо, не самое обычное). В качестве фреймворка был выбран Kivy — фактически, безальтернативный вариант, но он мне очень понравился. Однако, по нему не так уж много информации (нет, документация отличная, но иногда её недостаточно), особенно на русском языке, а некоторые вещи хоть и можно реализовать, но их то ли никто раньше не делал, то ли не счёл нужным поделиться информацией. Ну а я счёл 🙂 И этот пост тому результатом.

Под катом я расскажу обо всех этапах разработки, о том, как развивалась простая идея и как для этого приходилось искать новые возможности, о возникших подводных камнях и багах, о неочевидных решениях и устаревшей документации 🙂 Цель — описать в одном тексте основные пункты, чтобы человеку, решившему написать что-то немного сложнее игры Pong из официального туториала, не приходилось перерывать официальный форум поддержки и StackOverflow и тратить часы на то, что делается за пару минут, если знаешь, как.

0. Если вы впервые слышите о Kivy.

… то всё зависит от того, любите ли вы Python и Android, и интересно ли вам в этом разобраться. Если нет — проще забить 🙂 А если да, то начать нужно с официальной документации, гайдов, и уже упомянутого официального туториала по игре Pong — это даст базовое представление о фреймворке и его возможностях. Я же не буду останавливаться на столь тривиальных вещах (тем более, для понимания базовых принципов туториал отлично подходит) и сразу пойду дальше. Будем считать, что это было вступление 🙂

1. Немного о моей игре

Для начала нужна была идея. Мне хотелось что-то достаточно простое, чтобы оценить возможности фреймворка, но и достаточно интересное и оригинальное, чтобы не программировать ради программирования (это здорово, но когда это не единственная цель — это ещё лучше). Я неплохо проектирую интерфейсы, но не умею рисовать, поэтому игра должна была быть простая графически, или вообще текстовая. И тут так уж сложилось, что у меня есть заброшенный сайт с цитатами, с которого я когда-то начинал свой путь в web-разработке (я о нём даже писал на Хабре много лет назад). Поэтому идея возникла такая: игра-викторина «Угадай цитату». В русскоязычном Google Play ничего подобного не было, а в англоязычном была пара поделок низкого качества с сотней скачиваний.

Читайте также:  Андроид 2021 год лучше топ хит

Почти сразу же стало понятно, что просто так отгадывать цитату за цитатой — скучно. Так появились первые «фишки», которые, в итоге, и определили итоговую игру. В первую очередь это были тематические пакеты (то есть пакеты цитат, объединённые одной темой или автором) и баллы (которые начисляются за отгадывание цитат и прохождение пакетов, и тратятся на подсказки и разблокировку новых тем), а также статистика, достижения и избранное.

Так всё начиналось (кликабельно):

Ну ладно, ладно, больше не буду показывать такой ужас 🙂 Кстати, вот так оно выглядит сейчас (тоже кликабельно, скрины взяты с Google Play):

Первые проблемы начались с первого же экрана…

2. Kivy тормоз или я что-то делаю не так?

Один мой друг любит отвечать на такие вопросы «да» 🙂 На самом деле, некоторые вещи в Kivy действительно работают медленно, например, создание виджетов. Но это не значит, что это дело нельзя оптимизировать. Об этом я и расскажу.

Так как цитаты и темы хранятся в БД, то, само собой, кнопки с пакетами генерируются динамически. И вот тут-то я обнаружил, что происходит это очень медленно: примерно полсекунды на список из 20 кнопок. Возможно, это и не очень много при загрузке приложения, но при переходе на главный экран из других внутренних экранов приложения — непозволительно много. Здесь стоит отметить, что кнопка к тому моменту уже представляла собой, на самом деле, набор из нескольких элементов, визуально составляющих одну кнопку:

Первым моим побуждением было тем или иным образом закешировать их, и, действительно, опыт показал, что если создать все виджеты заранее, и сохранить их как свойство объекта StartScreen, то всё (кроме первой генерации) работает достаточно быстро. Однако же, данные в кнопках нужно периодически обновлять (хотя бы то же количество отгаданных цитат). Да и загрузку новых пакетов я уже тогда планировал. Конечно, не проблема реализовать и это, но я решил не изобретать велосипед и подумать.

Сначала стоило убедиться, что проблема именно в создании виджетов, поэтому я за несколько минут набросал простенькое приложение на два экрана, в каждом из которых генерировался набор строк из лейбла и чекбокса количеством 50 шт. 🙂

Запустил на своём стареньком Moto G (gen3) и получил:

И далее в том же духе. Поиск по этому вопросу ничего не дал, поэтому я обратился к разработчикам. И получил ответ: «Создание виджетов относительно медленное, особенно в зависимости от того, что они содержат. Для создания больших списков лучше использовать RecycleView». Здесь хочу пояснить, почему я вообще описываю этот момент, ведь описание RecycleView есть в документации. Да, действительно, есть, но мало кто способен изучить и запомнить всю документацию перед тем, как начнёт разработку, и найти нужный инструмент бывает непросто, особенно если он нигде не описан в контексте решения конкретной проблемы. Теперь же он описан 🙂

Более чем в 100 раз быстрее. Впечатляет, не правда ли?

В завершение следует упомянуть, что RecycleView — не панацея. Он не подходит, если размер элемента зависит от содержимого (например, Label, размер которого меняется в зависимости от количества текста).

3. Сервисы. Автозапуск и перезапуск

Следующая проблема, с которой я столкнулся, не поддавалась решению так долго, что я уже малодушно подумывал счесть данный фреймворк непригодным и забить 🙂 Проблема была с сервисами (в Android так называется процессы, выполняющиеся в фоновом режиме). Создать сервис не так уж и сложно — немного сбивает с толку устаревшая документация, но и только. Однако, в большинстве случаев, много ли толку от сервиса, который, во-первых, не запускается автоматически при загрузке телефона, а во-вторых, не перезапускается, если «выбросить» приложение свайпом из диспетчера задач? По-моему, нет.

Читайте также:  Прошивка для андроид через флешку

На тот момент по этой теме была всего лишь одна статья в официальной wiki, но она, хоть и называлась «Starting Kivy service on bootup», на самом деле всего лишь рассказывала, как при загрузке телефона запустить приложение, но не его сервис (да, такое тоже бывает полезно, но значительно реже, как по мне). Ту статью я, в итоге, переписал, а здесь расскажу подробности.

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

Из приложения мы запускаем его методом основного класса при помощи PyJnius:

Если APK собран правильно, при запуске приложения сервис будет стартовать, но этого недостаточно.

Для начала, попробуем сделать так, чтобы он перезапускался при остановке приложения (например, при снятии его из диспетчера задач). Конечно, можно было бы использовать startForeground, но это уже не совсем фоновое выполнение задачи 🙂 Для него потребуется, как минимум, уведомление — это не всегда подходит. В данном случае идеально подходит флаг START_STICKY, но мы же пишем на Python, что делает задачу не столь тривиальной — по крайней мере, при помощи PyJnius она уже не решается.

Честно говоря, она вообще решается достаточно криво, поскольку я пока не готов становиться одним из разработчиков Python4Android, благодаря которому всё это счастье вообще работает. А изменения нужно вносить именно в код Python4Android. А конкретно, нам нужен файл .buildozer/android/platform/build/dists/guessthequote/src/org/kivy/android/PythonService.java в котором в функции startType() мы меняем флаг START_NOT_STICKY на START_STICKY:

Ура, сервис рестартится. Всё? Конечно, нет 🙂 Потому что он тут же валится с ошибкой:

Проблема в функции onStartCommand(Intent intent, int flags, int startId), поскольку после перезапуска intent у нас null. Что ж, перепишем и её:

Проблема в том, что функция nativeStart() не получает нужных Extras. К сожалению, два из них мне пришлось захардкодить. В итоге выглядит это так:

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

Для начала понадобится разрешение RECEIVE_BOOT_COMPLETED — это просто. А затем — BroadcastReceiver, его придётся добавить в AndroidManifest вручную, но это тоже не проблема. Проблема в том, что в нём писать 🙂

Решение для запуска приложения (не сервиса) выглядит так:

Сначала я попытался просто переписать его для сервиса:

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

Локализация и мультиязычность

В целом, для локализации можно использовать gettext, или же поступить ещё проще — создать папку lang, в ней по файлу на каждый язык (например, en.py и ru.py), определить там все слова и фразы в виде переменных/констант, и далее подключить нужный модуль. Примерно так:

Статическая переменная использована для того, чтобы языковые константы было удобно использовать в kv-файле:

Источник

Оцените статью