Есть несколько GUI‑фреймворков на Python. Большинство из них предназначены только для десктопных приложений. Kivy — редкое исключение: с использованием этого фреймворка можно, в теории, строить мобильные приложения. К сожалению, он не готов к продакшену. Вы вынуждены жонглировать версиями библиотек, чтобы заставить это работать. Так что, даже сидя в футболке с надписью print("Python is my favorite language"), я должен признать, что Kivy не подходит для мобильной разработки.
Хорошо. Жонглировать версиями приходится и в случае веб‑приложения. Но всё‑таки тогда в 99 % случаев речь идёт о библиотеках Python либо есть контроль над окружением. В целом вы можете построить Docker‑образ с любыми версиями, какие необходимы. Kivy же вносит кучу бинарных зависимостей, которые должны быть установлены с помощью специфичных для платформ инструментов. И в целом вы не сможете контролировать окружение — а это меняет всё.
Недавно я решил сделать маленькое приложение для чтения QR‑кода на Android. Я использую Python каждый день, так что решил: нет причин не воспользоваться Kivy. И через два часа у меня было десктопное приложение, которое работало довольно хорошо:
from kivy.app import App
from kivy.lang import Builder
from zbarcam.zbarcam import zbarcam
DEMO_APP_KV_LANG = """
BoxLayout:
orientation: 'vertical'
ZBarCam:
id: zbarcam
code_types: 'qrcode', 'ean13'
Label:
size_hint: None, None
size: self.texture_size[0], 50
text: 'test: ' + ', '.join([str(symbol.data) for symbol in zbarcam.symbols])
"""
class DemoApp(App):
def build(self):
return Builder.load_string(DEMO_APP_KV_LANG)
if __name__ == '__main__':
DemoApp().run()
В действительности я потратил 5 минут на поиск и копирование этого сниппета и 1 час 55 минут — чтобы заставить его работать. Я предполагал, что это должно занять максимум 10–15 минут. Всё из‑за бинарных зависимостей: версия zbarcam из kivy‑garden была слишком старой и не работала. Ещё два дня я потратил на попытки сборки проекта под Android — безрезультатно. Я так и не смог найти работающую пару версий Kivy и Cython.
Я решил остановиться на этом. Я люблю Python, но есть более стабильные технологии для того, чтобы сделать такое приложение. Даже Cordova и JS подходят для подобной задачи лучше: они более зрелые и стабильные. Xamarin — другая хорошая альтернатива. Не используйте технологию для задач, не очень подходящих для неё, только из‑за того, что вы её знаете.