Разработка мобильных приложений на 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
- Compile Python and modules
- Create Xcode project
- Insert your code in project
- Link Python and modules
- Customize (title, icons, etc)
- 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