Мобильное приложение на Kivy и Python? Мм… Не сейчас

Опубликовано 25 октября 2018 в Python

Есть несколько GUI фреймворков на Python. Большинство из них только для десктопных приложений. Kivy - редкое исключение. С использованием этого фреймворка можно, в теории, строить мобильные приложения. К сожалению, он не готов к продакшену. Вы вынуждены жонглировать версиями библиотек чтобы заставить это работать. Так что даже сидя в футболке с надписью print("Python is my favorite language"), я должен признать, что он не подходит для мобильной разработки.

Ok. Также жонглировать версиями надо и в случае веб-приложения. Но все-таки тогда в 99% случаев жонглировать надо библиотеками Python или же есть контроль над окружением. В целом вы можете построить docker-образ с любыми версиями, какие необходимы. Но с Kivi вносит кучу бинарных зависимостей, которые должны быть установлены с помощью специфичных для платформ инструментов. И в целом вы не сможете контролировать окружение. И это меняет все.

Недавно я решил сделать маленькое приложение для чтения 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 — другая хорошая альтернатива. Не используйте технологию для не очень подходящих для нее задач только из-за того, что знаете ее.