Главная > Разработка приложений > Создание приложения для android на python с kivy

Владислав Громов
244

Разбираю софт для Android-планшетов. Пишу инструкции и обзоры.
920
2 минуты

Слушай, а что если бы я сказал, что ты можешь написать приложение для Android на Python?

Звучит немного как фантастика, правда? Все вокруг твердят про Kotlin, Java, Flutter, а тут такой поворот. Но нет, это не шутка. В мире Python, где царствуют data science и веб-бэкенды, есть тихий, но очень боевой уголок — фреймворк Kivy. Именно он позволяет твоему любимому Python'у выйти за пределы сервера и попасть прямо в карман пользователя, в виде APK-файла.

Идея не нова, но от этого не менее волшебная. Представь: один и тот же код, который ты отлаживал на ноутбуке, можно упаковать под Android (и iOS, кстати, тоже). Не нужно учить новый синтаксис, не нужно осваивать Android Studio с нуля. Звучит как мечта ленивого гения? Это практически она и есть. Давай разберемся, как это работает на практике, с какими подводными камнями столкнешься и стоит ли игра свеч.

Сразу оговорюсь: Kivy — это не серебряная пуля, которая заменит нативную разработку во всех проектах. Для хайпового мобильного стартапа с тоннами анимаций и сложнейшим UI, возможно, нет. Но для прототипов, внутренних инструментов, утилит, игр или приложений с нестандартным дизайном — это мощнейший инструмент в твоих руках. Тем более, если ты уже питонист до кончиков пальцев.

Kivy и KivyMD: две стороны одной медали

Итак, что же это за зверь такой — Kivy? По сути, это кроссплатформенный фреймворк с открытым исходным кодом, написанный на Python и Cython. Его главная фишка — он рисует интерфейсы сам, используя OpenGL. Это значит, что твое приложение будет выглядеть одинаково на Windows, macOS, Linux, Android и iOS. С одной стороны, это круто: пишешь один раз — запускаешь везде. С другой — это и его главный недостаток: интерфейс будет *не нативным*. Он не будет использовать системные виджеты Android или iOS. Для кого-то это критично, а для кого-то, наоборот, плюс — полная свобода в дизайне.

Изображение

А вот тут на сцену выходит KivyMD. Это библиотека-надстройка над Kivy, которая реализует дизайн-систему Google — Material Design. Она предоставляет те самые красивые кнопки, карточки, панели навигации и диалоги, к которым привыкли пользователи Android. С KivyMD твое приложение на Python внезапно начинает выглядеть как "родное". Это уже не просто набор квадратиков, а что-то современное и узнаваемое. В связке они — Kivy (движок) и KivyMD (красивая оболочка) — становятся грозным дуэтом.

Стартуем: ставим Kivy и настраиваем окружение

Первое правило Kivy-клуба — используй виртуальное окружение. Серьезно, не игнорируй этот шаг. Библиотека со своими зависимостями может конфликтовать с другими твоими проектами. Открывай терминал и поехали.

  1. Создаем и активируем виртуальное окружение:
    python -m venv kivy_venv # Для Linux/macOS: source kivy_venv/bin/activate # Для Windows: kivy_venv\Scripts\activate
    Ты увидишь, как в начале строки терминала появится имя окружения `(kivy_venv)`.
  2. Устанавливаем Kivy и KivyMD: Это делается одной командой через pip.
    pip install kivy pip install kivymd
    В зависимости от системы, установка Kivy может потребовать предварительной установки некоторых системных зависимостей (вроде библиотек для SDL2). Если что-то пошло не так, подробные инструкции для каждой ОС есть на официальном сайте.
  3. Выбираем редактор кода: Подойдет любой. VS Code с расширением Python — отличный выбор. PyCharm тоже прекрасно справляется. Главное, убедись, что в настройках проекта выбран интерпретатор из твоего виртуального окружения.

Вот и все. Среда готова. Теперь самое интересное — напишем что-нибудь.

Изображение

Пишем первое приложение: от "Hello World" до счетчика

Традиции чтить надо, но "Hello World" в Kivy — это скучно. Давай сразу сделаем что-то полезное и наглядное — простой счетчик нажатий. Это как раз тот случай, когда за полчаса ты увидишь весь цикл: код, интерфейс, логику.

В Kivy часто используют разделение кода: логику на Python, а разметку интерфейса — на специальном языке Kv. Он очень простой и наглядный. Создадим два файла в одной папке: `main.py` и `counter.kv`.

Изображение

Файл counter.kv (описание интерфейса):

: orientation: "vertical" padding: 20 spacing: 20 Label: id: count_label text: "0" font_size: 50 halign: "center" BoxLayout: orientation: "horizontal" spacing: 20 size_hint: (1, 0.3) Button: text: "-" font_size: 30 on_press: app.decrease() # Вызываем метод из Python-кода Button: text: "+" font_size: 30 on_press: app.increase()

Файл main.py (логика приложения):

from kivy.app import App from kivy.uix.boxlayout import BoxLayout from kivy.properties import NumericProperty class CounterApp(BoxLayout): # Специальное свойство Kivy, за которым фреймворк сам следит count = NumericProperty(0) def increase(self): self.count += 1 def decrease(self): self.count -= 1 class CounterMainApp(App): def build(self): # Kivy автоматически найдет файл counter.kv и загрузит разметку return CounterApp() if __name__ == '__main__': CounterMainApp().run()
Волшебство здесь в том, как Kivy связывает Kv-файл и Python-класс. Имя класса в Kv-файле (`:`) должно совпадать с именем класса-виджета в Python. Фреймворк сам найдет Label с `id: count_label` и свяжет его свойство `text` со свойством `count` нашего класса, потому что в Kv мы указали `text: str(root.count)`. Автоматическая привязка данных — это одна из самых сильных сторон Kivy.

Запусти `main.py`. Появится окно с цифрой и двумя кнопками. Нажимай "плюс" и "минус" — счетчик работает! Ты только что написал свое первое кроссплатформенное приложение. Этот же код, с минимальными изменениями, позже станет APK-файлом для телефона.

Идем глубже: калькулятор на KivyMD для солидности

Со счетчиком разобрались. Давай повысим ставки и сделаем что-то посложнее и красивее — тот же калькулятор, но уже с использованием KivyMD. Это покажет, как легко придать приложению современный look & feel.

Установим KivyMD, если еще не сделал этого: `pip install kivymd`. Теперь создадим новый проект.

Файл calc.py:

from kivymd.app import MDApp from kivy.lang import Builder from kivy.core.window import Window # Для удобства зададим размер окна для десктопной версии Window.size = (350, 550) KV = ''' BoxLayout: orientation: "vertical" padding: 10 spacing: 10 MDToolbar: title: "Калькулятор на Python" elevation: 10 MDTextField: id: display hint_text: "0" font_size: "40sp" halign: "right" readonly: True mode: "fill" fill_color: 0, 0, 0, 0.1 GridLayout: cols: 4 spacing: 5 padding: 5 # Кнопки раскладываем в привычном порядке MDRaisedButton: text: "C" on_press: app.clear() MDRaisedButton: text: "<" on_press: app.backspace() MDRaisedButton: text: "%" MDRaisedButton: text: "/" on_press: app.set_operation("/") MDRaisedButton: text: "7" on_press: app.add_digit("7") MDRaisedButton: text: "8" on_press: app.add_digit("8") MDRaisedButton: text: "9" on_press: app.add_digit("9") MDRaisedButton: text: "*" on_press: app.set_operation("*") MDRaisedButton: text: "4" on_press: app.add_digit("4") MDRaisedButton: text: "5" on_press: app.add_digit("5") MDRaisedButton: text: "6" on_press: app.add_digit("6") MDRaisedButton: text: "-" on_press: app.set_operation("-") MDRaisedButton: text: "1" on_press: app.add_digit("1") MDRaisedButton: text: "2" on_press: app.add_digit("2") MDRaisedButton: text: "3" on_press: app.add_digit("3") MDRaisedButton: text: "+" on_press: app.set_operation("+") MDRaisedButton: text: "0" cols: 2 on_press: app.add_digit("0") MDRaisedButton: text: "." on_press: app.add_digit(".") MDRaisedButton: text: "=" on_press: app.calculate() ''' class CalculatorApp(MDApp): current_input = "" previous_input = "" operation = None def build(self): self.theme_cls.primary_palette = "BlueGray" return Builder.load_string(KV) def add_digit(self, digit): self.current_input += digit self.root.ids.display.text = self.current_input def set_operation(self, op): if self.current_input: self.previous_input = self.current_input self.current_input = "" self.operation = op self.root.ids.display.text = f"{self.previous_input} {op}" def calculate(self): if self.previous_input and self.current_input and self.operation: try: a = float(self.previous_input) b = float(self.current_input) if self.operation == "+": res = a + b elif self.operation == "-": res = a - b elif self.operation == "*": res = a * b elif self.operation == "/": res = a / b if b != 0 else "Ошибка" self.root.ids.display.text = str(res) self.current_input = str(res) self.previous_input = "" self.operation = None except Exception as e: self.root.ids.display.text = "Ошибка" self.current_input = "" def clear(self): self.current_input = "" self.previous_input = "" self.operation = None self.root.ids.display.text = "0" def backspace(self): self.current_input = self.current_input[:-1] self.root.ids.display.text = self.current_input or "0" if __name__ == '__main__': CalculatorApp().run()

Запусти этот файл. Увидишь аккуратный калькулятор в стиле Material Design с панелью инструментов, полем ввода и сеткой кнопок. Логика проста, но она уже делает главное — вычисления. Обрати внимание, как мы используем `self.root.ids` для доступа к виджетам из Kv-разметки по их `id`. Это основной способ взаимодействия.

Волшебный Buildozer: превращаем код в APK

А теперь самая магическая часть. У нас есть работающее десктопное приложение. Как его засунуть в телефон? Для этого существует утилита Buildozer. Это такая волшебная палочка, которая берет твой Python-код, все зависимости, Python-интерпретатор и упаковывает это в валидный APK-файл. Работает она, правда, лучше всего под Linux. На Windows придется танцевать с WSL или виртуальной машиной.

Вот пошаговый план превращения нашего счетчика в APK:

  1. Установи Buildozer и зависимости: В Linux (Ubuntu/Debian) это выглядит так:
    sudo apt update sudo apt install -y git zip unzip openjdk-17-jdk python3-pip autoconf libtool pkg-config zlib1g-dev libncurses5-dev libncursesw5-dev libtinfo5 cmake libffi-dev libssl-dev pip3 install --user --upgrade buildozer cython virtualenv
  2. Инициализируй проект: Перейди в папку с проектом (где лежит `main.py`) и выполни:
    buildozer init
    Это создаст файл `buildozer.spec` — конфигурацию для сборки.
  3. Настрой `buildozer.spec`: Открой этот файл и найди важные строки:
    • `title = My Application` → поменяй на название своего приложения.
    • `package.name = myapp` → задай уникальное имя пакета (обычно в стиле `com.твоеназвание.приложение`).
    • `package.domain = org.test` → измени домен.
    • `source.dir = .` → путь к исходникам, оставь точку, если все в текущей папке.
    • `source.main = main.py` → убедись, что указан правильный входной файл.
    • `requirements = python3,kivy,kivymd` → вот здесь ключевой момент! Перечисли ВСЕ зависимости через запятую. Для нашего калькулятора: `python3,kivy,kivymd`.
    • `orientation = portrait` → ориентация экрана.
  4. Запусти сборку: Это долгий процесс (может занять 20-30 минут при первом запуске, так как Buildozer скачает Android SDK, NDK и соберет все с нуля). Команда проста:
    buildozer -v android debug
    Ключ `-v` для подробного вывода, чтобы видеть, что происходит.
Самый частый источник ошибок на этом этапе — недостаток оперативной памяти или места на диске. Buildozer требует ресурсов. Также внимательно читай вывод в терминале — там часто прячутся подсказки о пропущенных зависимостях, которые нужно добавить в `requirements`.

Если все прошло успешно, готовый APK-файл найдешь в папке `bin/`. Скидывай его на телефон, разреши установку из неизвестных источников в настройках безопасности и запускай! Твое Python-приложение живет на Android.

А что там с железом? Доступ к камере, GPS и уведомлениям

"Ладно, — скажешь ты, — квадратики двигать я научился. А как быть с настоящим мобильным функционалом?" Kivy не оставляет тебя и здесь. Для доступа к нативным функциям устройства существует проект Plyer. Это кроссплатформенный Python-интерфейс для платформенно-специфичных вещей.

Хочешь получить GPS-координаты? Проверить заряд батареи? Включить вибрацию? Отправить Push-уведомление? С Plyer это делается в пару строк.

from plyer import gps, vibrator, notification # Запуск GPS (нужны соответствующие пермишены в buildozer.spec!) gps.configure(on_location=your_location_callback) gps.start() # Вибрация на 2 секунды vibrator.vibrate(2) # Простое уведомление notification.notify( title='Привет от Python!', message='Kivy может и это.', app_name='Мое Kivy Приложение' )

В файле `buildozer.spec` для этого нужно не забыть добавить нужные Android-пермишены (раздел `android.permissions`), например, `ACCESS_FINE_LOCATION`, `VIBRATE`, `INTERNET`.

Стоит ли овчинка выделки? Плюсы, минусы и выводы

Давай честно взвесим все за и против разработки Android-приложений на Python с Kivy.

Плюсы:

  • Скорость прототипирования: Если ты питонист, ты можешь за день набросать рабочее приложение, не открывая документацию по Kotlin.
  • Единая кодовая база: Один код для десктопа и мобилок — мечта многих проектов.
  • Свобода дизайна: Ты не ограничен системными виджетами. Можешь нарисовать любой интерфейс, какой захочешь. Отлично подходит для игр и приложений с кастомным UI.
  • Доступ к железу: Через Plyer и PyJNIus (более низкоуровневый инструмент) можно получить доступ практически ко всему.

Минусы и подводные камни:

  • Производительность: Это интерпретируемый код, работающий в "песочнице". Для графически нагруженных 3D-игр или очень сложных интерфейсов с анимациями может не хватить скорости. Хотя для большинства утилитарных приложений этого более чем достаточно.
  • Размер APK: Финальный файл будет весить немало (часто 20-30 МБ и больше), потому что внутрь упаковывается целый Python-интерпретатор и все библиотеки.
  • "Ненативный" вид: Даже с KivyMD приложение может немного отличаться по ощущениям от нативных. Ценители заметят.
  • Сложность отладки на устройстве: Отлаживать код, работающий внутри APK, сложнее, чем десктопное приложение. Придется много работать с логами.
  • Зависимость от комьюнити: Инструменты вроде Buildozer — это проекты с открытым исходным кодом, поддерживаемые энтузиастами. Вдруг что-то сломается после обновления Android SDK — придется искать решение самому или ждать фикса.

Итог? Kivy — это не для каждого проекта, но это чертовски мощный инструмент, который открывает мобильную разработку для огромной армии Python-разработчиков. Он идеален для:

  • Быстрых прототипов и MVP.
  • Внутренних инструментов для компании.
  • Приложений с нестандартным, "нарисованным" дизайном.
  • Простых 2D-игр.
  • Ситуаций, когда нужно быстро закрыть задачу и не изучать новую экосистему.

Так что если тебя давно манила мобильная разработка, но пугал Java/Kotlin, или если у тебя есть идея для приложения-утилиты — бери Kivy, ставь Buildozer и погрузись в этот увлекательный мир. Ты удивишься, как далеко может зайти твой Python. Главное — начать с простого счетчика. А там, глядишь, и до следующего хита в Google Play недалеко.

Еще от автора

CarPlay на магнитоле с Android — это вообще реально? Или как не скачать пустышку

Вы наверняка знаете этот момент. Садитесь в машину друга, а у него на большом экране магнитолы — знакомый интерфейс с иконками Apple Maps, Spotify и сообщениями. Удобно, красиво, все под рукой. Это CarPlay. И первая мысль: «Эх, вот бы и мне такое, но у меня же магнитола на Android, а телефон — Android/iPhone, да и вообще всё сложно».

Хочу кнопки на руль, а машина не того года выпуска. Что делать?

Бывало у вас такое: едете по трассе, любимый трек вот-вот перейдет в кульминацию, а чтобы прибавить громкость, приходится тянуться к магнитоле, на секунду отрывая взгляд от дороги? Или звонок, а на сенсорном экране тыкаешь в крошечную кнопку «принять» с третьей попытки? Знакомое чувство. Кажется, что современная Android-магнитола с её огромным экраном дала все возможности, но отняла самое простое — удобное и безопасное управление на ходу.

Мой телефон снова превращается в свалки: а нужен ли вообще деинсталлятор на Android?

Знакомая картина: открываешь список приложений на своём Android-смартфоне, а там — десятки иконок. Половину ты не запускал со времён зарядки по акции, другая половина — навязчивые «подарки» от производителя, которые и удалить-то нельзя. Свободное место тает на глазах, батарея садится быстрее, и в голове зреет спасительная мысль: «Надо всё это почистить!».

А как же друзья? Быстро переносим контакты с iPhone на Android без проводов и заморочек

Вы сменили лагерь. Или просто купили новый смартфон. Телефон уже в руках, он блестит новеньким корпусом, хочется поскорее всё настроить и начать пользоваться. Но возникает первый и самый важный вопрос: а как же все контакты? Вся телефонная книга, годами собиранные номера коллег, друзей, родственников, сантехника дяди Васи — всё это осталось в старом iPhone. Мысль о том, что их придётся вбивать вручную или, не дай бог, потерять, заставляет нервно ёрзать.