Привет, Хабр! (и читатели Дзена)
Всегда хотели написать приложение для Android, но думали, что для этого нужно учить Java или Kotlin? У меня для вас хорошие новости. Есть фреймворк Kivy, который позволяет писать приложения на чистом Python.
Сегодня мы на коленке соберем простой, но симпатичный калькулятор. Вы удивитесь, но большую часть кода займет не логика, а описание кнопок. Поехали!
Что нам понадобится?
- Python (версия 3.6 или выше). Если у вас Windows, не забудьте поставить галочку "Add Python to PATH" при установке.
- Библиотека Kivy. Установим её через терминал.
Открываем командную строку (терминал) и пишем:
pip install kivy
Если вы на MacOS или Linux, возможно, понадобится добавить sudo или использовать pip3.
Структура приложения
Наш калькулятор будет состоять из двух частей:
- main.py — здесь будет вся логика работы (что происходит при нажатии на кнопки).
- calculator.kv — это файл разметки (как HTML, только для Kivy). В нем мы опишем, как выглядят кнопки, где они лежат и какого они цвета.
Шаг 1. Создаем файл main.py
Создаем новую папку для проекта. Внутри создаем файл main.py и открываем его любым редактором кода (хоть блокнотом).
Вот полный код программы. Не пугайтесь, сразу после него будет подробный разбор.
Как это работает (объясняю на пальцах)
- CalculatorWidget — это "коробка", в которой лежат наши кнопки и экран.
- self.ids.input.text — мы обращаемся к полю ввода по имени input (мы пропишем это имя в следующем файле) и берем оттуда текст.
- eval() — встроенная функция Python, которая выполняет математические выражения, переданные как строка. Если в строке "2+2", она посчитает 4.
Шаг 2. Создаем файл calculator.kv
В той же папке создаем новый текстовый файл и называем его calculator.kv.
Важно: Название должно совпадать с именем класса CalculatorApp (без слова App) и быть написано маленькими буквами.
Вставляем туда этот код:
<CalculatorWidget>:
orientation: 'vertical'
padding: 5
spacing: 5
# Поле вывода результата (Display)
TextInput:
id: input
text: '0'
font_size: 35
size_hint_y: 0.2
multiline: False
readonly: True # Запрещаем ввод с клавиатуры
background_color: [0.1, 0.1, 0.1, 1]
foreground_color: [1, 1, 1, 1]
cursor_color: [1, 1, 1, 1]
# Контейнер для кнопок
GridLayout:
cols: 4 # Сетка в 4 колонки
size_hint_y: 0.8
spacing: 5
# Строка 1: Очистка, удаление, проценты, деление
Button:
text: 'C'
background_color: [0.8, 0.3, 0.1, 1]
on_press: root.calculate(self.text) # Передаем текст кнопки через self.text
Button:
text: '⌫'
background_color: [0.8, 0.5, 0.1, 1]
on_press: root.calculate(self.text)
Button:
text: '%'
background_color: [0.3, 0.3, 0.3, 1]
on_press: root.calculate(self.text)
Button:
text: '/'
background_color: [0.3, 0.5, 0.8, 1]
on_press: root.calculate(self.text)
# Строка 2: 7, 8, 9, умножение
Button:
text: '7'
on_press: root.calculate(self.text)
Button:
text: '8'
on_press: root.calculate(self.text)
Button:
text: '9'
on_press: root.calculate(self.text)
Button:
text: '*'
background_color: [0.3, 0.5, 0.8, 1]
on_press: root.calculate(self.text)
# Строка 3: 4, 5, 6, минус
Button:
text: '4'
on_press: root.calculate(self.text)
Button:
text: '5'
on_press: root.calculate(self.text)
Button:
text: '6'
on_press: root.calculate(self.text)
Button:
text: '-'
background_color: [0.3, 0.5, 0.8, 1]
on_press: root.calculate(self.text)
# Строка 4: 1, 2, 3, плюс
Button:
text: '1'
on_press: root.calculate(self.text)
Button:
text: '2'
on_press: root.calculate(self.text)
Button:
text: '3'
on_press: root.calculate(self.text)
Button:
text: '+'
background_color: [0.3, 0.5, 0.8, 1]
on_press: root.calculate(self.text)
# Строка 5: 0 (занимает 2 колонки), точка, равно
Button:
text: '0'
on_press: root.calculate(self.text)
Button:
text: '.'
on_press: root.calculate(self.text)
Button:
text: '='
background_color: [0.2, 0.7, 0.3, 1]
on_press: root.calculate(self.text)
Разбор разметки
- GridLayout: cols: 4 — создает таблицу 4 колонки, кнопки заполняют ее автоматически.
- Button — сама кнопка.
- on_press: root.calculate(text) — самое главное. Когда мы нажимаем на кнопку, вызывается метод calculate из нашего Python-класса (root), и в него передается текст кнопки (text).
- id: input — дали имя полю ввода, чтобы мы могли менять его текст из Python-кода.
Шаг 3. Запускаем!
Сохраняем оба файла. В терминале переходим в папку с проектом и пишем:
python main.py
Если вы всё сделали правильно, откроется окошко с работающим калькулятором!
Как собрать в APK (для Android)
Самое вкусное. Чтобы запустить это на телефоне, нам понадобится buildozer.
- Устанавливаем buildozer: pip install buildozer
- В папке с проектом (где лежат main.py и calculator.kv) запускаем: buildozer init
Появится файл buildozer.spec. - В файле buildozer.spec находим строчку requirements = и дописываем туда kivy. Должно получиться так:
requirements = python3,kivy
(Также можно сменить имя приложения, иконку и т.д.) - Подключаем телефон к компьютеру (с включенной отладкой по USB) или просто запускаем сборку.
- Пишем команду:buildozer android debug deploy run
Если вы на Linux, скорее всего, всё соберется с первого раза (под капотом поднимется виртуалка с Android SDK). Если вы на Windows, сборка APK напрямую невозможна, но можно использовать виртуальную машину с Linux или облачные сервисы вроде Google Colab.
Заключение
Мы только что написали кроссплатформенное приложение на Python, которое работает и на Windows, и на Android. Конечно, наш калькулятор пока "слепой" (не учитывает приоритет операций, если нажать 2+2+2+2= — посчитает, но с длинными выражениями eval() справляется).
Это отличная отправная точка. Дальше вы можете:
- Добавить больше кнопок (скобки, возведение в степень).
- Сменить тему оформления.
- Добавить историю вычислений.
Пишите код, экспериментируйте и не бойтесь Kivy. На этом всё, спасибо за внимание!