PyGTK SQLAlchemy пишемо каталогізатор фільмів
Давно хотів спробувати Python як інструмент розробки додатків під декстоп. Вибір GUI-бібліотеки з доступнихGTK, QT, wxPython іTkinter був складний, т.к. робочим столом у мене єGNOME і як відомо він побудований на GTK+, то я вирішив зупинитися на PyGTK - прошарки міжGTK+ таPython. Програми написані наGTK+ можуть жити не тільки під одними Linux, якщо поставити необхідні бібліотеки то можна буде запускати програми під MacOS і Windows, один плюс бібліотеки - кросплатформенної.
Як приклад напишемо додаток-каталогізатор фільмів для кіномана. Всі елементи інтерфейсу будуть наGTK+, фільми зберігатимуться в SQLite, для спілкування з базою даних використовуватиметься ORM - SQLAlchemy.
Коротко про GTK+
PyGTK є обгорткою над GUI-бібліотекоюGTK+ і надає можливості творити GUI-програми на Python.PyGTK складається з кількох компонентів:
- GObject - базовий клас, що надає загальні властивості та методи дляPyGTK класів;
- Glib надає основну об'єктну систему, що використовується в GNOME, реалізацію основного циклу, а також великий набір допоміжних функцій для рядків та типових структур даних. джерело
- GDK (GIMP Drawing Kit) - обгортка над низькорівневими бібліотеками для малювання та керування вікнами. Знаходиться міжGTK+ та X-сервером.
- Pango - відповідає за локалізацію та роботу зі шрифтами;
- ATK - набір інструментів для реалізації інтерфейсу для людей з обмеженими фізичними можливостями;
- Cairo - бібліотека для створення 2D графіки;
Якщо у вас робочий стіл GNOME, то в системі вже встановленоPyGTK, інакшейдемо на сторінку завантаження та качаємо версію для вашої платформи.
Перевіримо встановлені версіїGTK+ таPyGTK
Всі програми наPyGTK складаються з візуальних компонентів -віджетів. Які можуть бути видимими (кнопки, комбобокси і т.д.) і не видимими (наприклад, лейаути). Більшість віджетів можуть реагувати на певніподії, що генеруються X-сервером. Коли користувач клацає по кнопці - генеруєтьсясигнал, який породжує подію - clicked, програмісту залишається тільки написати обробник на подію. Усі події в програмі керують головним циклом обробки подій, що запускається під час ініціалізації програми.
Для побудови інтерфейсу програми можна використовувати два підходи: вручну описувати всі віджети та порядок їх розміщення на формі, або скористатися Glade – так званий RAD (rapid application development), GUI-інструмент для візуального проектування інтерфейсу. Процес зводиться до накидання віджетів на форму (як Delphi або QT Designer) і призначення імен для обробників подій. Після цього весь результат зберігається в XML-файл, який парситься за допомогоюlibglade у конструкторі головного вікна програми. В результаті ми отримуємо готовий інтерфейс. Хороший опис роботи зGlade є тут.
Я використовував перший підхід - вручну описував і розміщував віджети на формі, так краще формується розуміння внутрішньої кухні, а потім можна переходити доGlade для мінімізування часу на проектування інтерфейсу.
- HBox – віджети розміщуються горизонтально, один за одним;
- VBox – віджети розміщуються вертикально, один за одним;
- Fixed - віджети розміщуються на заданих x та y координатах
- Table - віджети розміщуються всерединіне видимої таблиці
- Alignment - дозволяє регулювати позицію та розміри вкладених віджетів щодо батьківського віджету
Коротко для SQLAlchemy
SQLAlchemy — це програмне забезпечення з відкритим вихідним кодом для роботи з базами даних за допомогою мови SQL. Воно реалізує технологію програмування ORM (Object-Relational Mapping), яка пов'язує бази даних із концепціями об'єктно-орієнтованих мов програмування. SQLAlchemy дозволяє описувати структури баз даних та способи взаємодії з ними прямо на мові Python. джерело
Перевіримо результат установки
Для створення ORM з існуючою БД використовуватимемо декларативний підхід, який зводить до мінімуму процес встановлення зв'язку. Розглянемо приклад роботиSQLAlchecmy таSQLite на прикладі моделі майбутньої програми.
Імпортуємо використовувані методи та типи полів:
Створюємо об'єкт, які відповідають за роботу з БД і вказуємо виводити в консоль всі SQL-запити - зручно для налагодження.
Створюємо об'єкт, що відповідає за виконання транзакції і виконання запитів
Створимо базовий клас, від якого потім успадковуватимемося модель 'Фільми'
Власне сама модель в атрибутіtablename вказується ім'я таблиці, в якій буде зберігатися список фільмів. Інші атрибути являють собою характеристики моделі і за сумісництвом будуть колонками таблиці:
Створимо файл з базою даних та необхідними таблицями
Спробуємо створити запис про новий фільм
А тепер виберемо всі фільми з БД:

На початку я побіжно торкнувся розташування віджетів на формі за допомогою лейаутів, зараз опишу трохи докладніше один з них - VBox, на ньому всі віджети розташовуються вертикально, один за одним.
Створюється цей лейаут так:
Перший параметр конструктора, homogeneous, значення якого в даному випадку дорівнює False, означає, що кожен віджет, розташований на цьому лейауті, може займати різну висоту по вертикалі, якщо встановити True то для всіх віджетів буде встановлена однакова висота (загальна висота залежить від батька). Другий параметр виставляє відступи, у пікселях, між вкладеними блоками.
Віджети можуть додаватися на лейаут з двох сторін, у випадку VBox зверху (метод pack_start) і знизу (метод pack_end).
сигнатура методу pack_start:
- перший параметр (child) - віджет, що додається;
- другий (expand) - булевський параметр, відповідає за розміри віджету, що розміщується, і вказує чи буде (якщо True) віджет займати все доступне місце або виділений блок притиснеться до розмірів віджету (False);
- третій параметр (fill) - дійсний якщо expand = True, якщо fill = True то віджет розтягнеться до розмірів виділеного блоку, інакше - навколо віджету буде порожнє місце;
- останній параметр (padding) – внутрішні відступи, у пікселях;
Для зберігання табличних даних використовується віджет gtk.TreeView із сховищем даних (gtk.ListStore). Нижче ми створимо екземпляр віджету та передамо йому вже наповнене сховище даних. Наповнення сховища відбувається банальною ітерацією за всіма записами в БД та додаванням у сховище за допомогою методу append, якому передається список значень (див. вихідні записи в прикріпленому нижче файлі).
Наступним етапом ми створимо стовпчики для віджету TreeView, за це відповідає метод create_columns
Для віджету TreeView призначено двох обробників події:
- подіяrow-activated - подвійний клік по рядку з фільмів, викликається діалогове вікно дляредагування вибраного фільму;
- подіяcursor-changed - одинарний клік по рядку з фільмів, або переміщення за списком за допомогою курсорів - оновлюється статус у рядку стану;