30
- почем опиум для народа? (с) Остап Бендер Write once run anywhere

«Write once run anywhere — почём опиум для народа?» Игорь Новиков, Scalr

Embed Size (px)

Citation preview

- почем опиум для народа? (с) Остап Бендер

Write once run anywhere

• GUI приложение с нуля • Сопровождение легаси кода • Портирование легаси

Применимость доклада

В рамках работы:

Вне работы:• Персональные проекты

• Быстрая разработка • Компактность кода • Мультиплатформенность • Зрелая экосистема

Преимущества разработки на Python

• Медленный runtime у Python

Отрицательные стороны разработки на Python

Пример сложного десктопногоприложения на Python

Основные десктопные системы

MacOS

Windows

Linux

• Небольшой размер• Нетребовательность к ресурсам

• Нативный вид• Системная интеграция

ТРЕБОВАНИЯК КРОССПЛАТФОРМЕННОМУ

GUI ПРИЛОЖЕНИЮ

Виджетсеты платформ

Carbon/Cocoa

WinAPI

Gtk+/Qt

Биндинги к Python

PyObjC

pywin32

PyGtkPyQt/PyKDE

Python как основа для кроссплатформенныхприложений

Три независимых проекта, использующих платформенно-специфические биндинги:

• на Windows - pywin32 • на MacOS X - PyObjC • на Linux - PyGtk

Самый надежный путь, но при этом самый затратный

Казалось бы, что может быть проще? Правильно выбранный тулкит и

мультиплатформенное приложение готово!

• Tkinter• PyQt• PyGtk• wxpython

МУЛЬТИПЛАТФОРМЕННЫЕ ТУЛКИТЫ

TkinterPyQt

PyGtk

wxpython

Look & Feelдля Tkinterна Linux платформе

"Что делать?" (с)и кто виноват :)

WX 3.0

WX 3.0

WX 2.8

WX 3.0 WX 3.0 WX 2.8

Получившаяся архитектура sK1

Приложение sK1

Widgetset AbstractionLayer (WAL)

Код на WAL

Код на wxpython

panel = wx.Panel() vbox = wx.BoxSizer(wx.VERTICAL) btn = wx.Button(panel, -1, "click Me") vbox.Add(btn, 0, wx.ALIGN_CENTER) btn.Bind(wx.EVT_BUTTON, self.OnClicked)

panel = wal.VPanel()btn = wal.Button(panel, "click Me", onclick=self.on_clicked)panel.pack(btn)

Код класса wal.Button

class Button(wx.Button, WidgetMixin):callback = None

def __init__(self, parent, text, size=DEF_SIZE,onclick=None, tooltip='', default=False, pid=wx.ID_ANY):

wx.Button.__init__(self, parent, pid, text, size=size)if default: self.SetDefault()if onclick:

self.callback = onclickself.Bind(wx.EVT_BUTTON, self.on_click, self)

if tooltip: self.SetToolTipString(tooltip)

def set_default(self):self.SetDefault()

def on_click(self, event):if self.callback: self.callback()

• Кроссплатформенность • Кроссвиджетсетность и кроссверсионность

• Код приложения не завязан на UI • Сокращение объема кода • Стиль кода по PEP-8 • Улучшение читабельности кода

Преимущества паттерна WAL

Паттерн WAL в контексте поддержки

легаси кода

PyGtk 2.8

КОДПРИЛОЖЕНИЯ

PyGtk 2.8

КОДПРИЛОЖЕНИЯ

PyGtk 2.8

КОДПРИЛОЖЕНИЯ

WAL

Gtk 3

КОДПРИЛОЖЕНИЯ

WAL

PyGtk 2.8

КОДПРИЛОЖЕНИЯ

WAL

Qt 5

КОДПРИЛОЖЕНИЯ

WAL

PyGtk 2.8

КОДПРИЛОЖЕНИЯ

WAL

PyGtk

Логика приложения

Widgetset AbstractionLayer (WAL)

TkinterTkinter

Упрощенный вариантмультиплатформенного приложения

PyObjC pywin32 PyGtk

Вариант создания полноценного мультиплатформенного приложения

Логика приложения

Widgetset AbstractionLayer (WAL)

Разработкаунифицированныхабстракционныхслоев для всехплатформ

Спасибо за внимание!И какие есть вопросы?