Разработка мобильных приложений на Python






     Дмитрий Овчинников                                              Wargaming.net
     PyCon'Ru 2014







О себе 


О себе 

  • Из города-героя Минск (Беларусь)
  • Первый компьютер выменял на обещание хорошо учиться
  • Пришел в web через постель Perl
  • Скрываю, что знаю PHP
  • Люблю программирование, борщ и маму
  • У меня есть айфон
  • Продам гараж

Titanium 


 Kivy


Kivy?

  • Windows, Linux, OS X, Android, iOS, Raspberry Pi
  • Canvas
  • 2D transform
  • OpenGL support
  • Shaders
  • Native events support
  • OpenSource
  • MIT license (GPLv3 earlier)

Общий код

Да ладно!

Как это работает?

  • Код на Python
  • Фреймворк Kivy
  • KV разметка
  • Упаковывается вместе с cPython (ARM only)
  • Генерация нативного bootstrap

Python

  • Python >= 2.7 and Python < 3
  • cPython
  • PyGame
  • Limitations

Kivy Framework

  • Canvas (PyGame, X11, SDL, EGL)
  • Native Events (HID, WM_Touch, Mac Touch...)
  • Modules / Garden
  • GPU acceleration
  • Layout/Widget UI structure
  • 2D animation/transforms
  • Raw OpenGL support (GLES2)
  • MultiThread (не забывайте про GIL)
  • Properties

События и потоки

Properties

  • StringProperty
  • NumericProperty
  • ObjectProperty
  • DictProperty
  • ListProperty
  • BooleanProperty
  • ReferenceListProperty

Примеры

 from kivy.properties import * from date time import date
				             my_int = NumericProperty(42) my_string = StringProperty('My string') my_dict = DictProperty({'key': 'value'}) my_obj = ObjectProperty(date()) my_ref = referenceListProperty(
    my_int, my_string, my_dict, my_obj
 )

Layout System

  • BoxLayout
  • GridLayout
  • StackLayout
  • AnchorLayout
  • FloatLayout

KV Language

 root = MyRootWidget()
                         box = BoxLayout()
                         box.add_widget(Button())
                         box.add_widget(Button())
                         root.add_widget(box)

KV Language

 MyRootWidget:
                            BoxLayout:
                                Button:
                                Button:

Это все еще Python

 MyWidget:
                            cols: len(some_data_from_python_file)
                            on_size: my_callback_method
                            pos: self.center_x / 2, self.center_y * 2

Это все еще Python

<MyWidget>:
                          label_widget: label_widget
                          Button:
                            text: 'Add Button'
                            on_press: root.add_widget(label_widget)

Как это работает?

<Marvel>  Label:    id: loki    text: 'Loki: I AM YOUR GOD!'  Button:    id: hulk    text: 'Press to smash Loki'    on_release: root.hulk_smash()

Как это работает?

class Marvel(BoxLayout):
                          def hulk_smash(self):
                            self.ids.hulk.text = "Hulk: Puny God!"
                            self.ids.loki.text = "Loki: >_<!!!"

Build and distribute

  • PyInstaller (Windows, OS X)
  • pip (Linux)
  • KV tool / Python for android / Buildozer (Android)

Build and distribute... iOS



Build and distribute... iOS

  1. Compile Python and modules
  2. Create Xcode project
  3. Insert your code in project
  4. Link Python and modules
  5. Customize (title, icons, etc)
  6. Try to build

Выводы

  • No native UI
  • No Windows Phone support (yet)
  • Mobile API *
  • No IDE support (JetBrains, ау!)
  • Сложно собирать и распространять (iOS)
  • Большой размер пакета (>= 6mb)

Выводы

  • Действительно кроссплатформа
  • Действительно "один код" * 
  • Mobile API *
  • KV language. Он тоже удобный
  • Отличная документация
  • Python!

* Plyer

  • Android: Pyjinus
  • iOS: PyObjinus
  • Desktop: Common libraries

Мое мнение



Links

  • http://kivy.org
  • https://github.com/kivy
  • http://youtube.com/
    => Search "Kivy crash course" playlist





Вопросы

Спасибо



Разработка мобильных приложений на Python

By Dmitry Ovchinnikov

Разработка мобильных приложений на Python

  • 3,197