Розробка сценаріїв для робочих столів Linux Частина 1
Використання Python та screenlet'ів для створення корисних програм для робочих столів в ОС Linux

Серія контенту:
Цей контент є частиною # із серії # статей: Розробка сценаріїв для робочих столів Linux.
Цей контент є частиною серії: Розробка сценаріїв для робочих столів Linux.
Слідкуйте за виходом нових статей цієї серії.
В якості основи розробки додатків для робочого столу Linux зазвичай використовується якась бібліотека для створення графічного інтерфейсу користувача (GUI framework). Для робочого столу GNOME зазвичай використовується бібліотека GTK+, а для робочого столу - KDE (K Desktop Environment) - бібліотека Qt. Обидві ці платформи містять всю функціональність, необхідну для розробки GUI-додатків, включаючи бібліотеки та інструменти для проектування вікон додатків, які використовуватимуть користувачі. У цій статті розповідається про те, як за допомогою набору віджетів – screenlet'ів (див. посилання в розділі Ресурси) розробляти програми, які ефективно взаємодіють з робочим столом Linux.
До списку програм для підвищення ефективності користування робочим столом потрапляють такі програми, як GNOME Do та Tomboy. Зазвичай користувачі можуть використовувати ці програми безпосередньо з робочого столу за допомогою спеціального комбінації клавіш або через "drag-and-drop" з інших програм, наприклад, Mozilla Firefox. Програма Tomboy працює як інструмент для створення нотаток на робочому столі і має можливість отримувати текст з інших вікон.
Початок роботи з screenlet'ами
Щоб почати розробляти screenlet'и, необхідно встановити кілька компонентів. Спочатку потрібно встановити пакетscreenlets за допомогою центру управління програмою в ОС Ubuntu або безпосередньо з командного рядка. Щоб завантажити потрібний пакет у поліSearch у вікні центру керування програмним забезпеченням слід ввести екрани. У результатах пошуку буде представлено дві опції: встановити основний пакет або встановити тільки документацію по screenlet'ах.
Python та Ubuntu
Для розробки screenlet'ів ми використовуємо мову Python. У стандартній інсталяції Ubuntu 10.04 є середовище Python 2.6, оскільки від неї залежить велика кількість утиліт. Однак, залежно від вимог програми, можуть знадобитися додаткові бібліотеки. Всі приклади, наведені в цій статті, були розроблені та протестовані в Ubuntu 10.04.
Після виконання цих дій необхідно завантажити вихідний код тестових screenlet'ів із Web-сайту screenlets.org. Тестовий screenlet знаходиться в папціsrc/share/screenlets/Test та використовує бібліотеки Cairo та GTK, які також потрібно встановити. Структуру стандартного screenlet'a можна вивчити на прикладі тестової програми, вихідний код якої знаходиться у файліTestScreenlet.py.
Мова Python є високорівневою об'єктно-орієнтованою мовою програмування, тому для визначення об'єктів використовується ключове слово class . У наведеному прикладі клас називається TestScreenlet, і в ньому визначено кілька методів. На рядку 42 у файліTestScreenlet.py міститься наступний код:
Створення простого screenlet'a
Основними компонентами screenlet'у є файл з піктограмою, файл з вихідним кодом та каталогthemes. Цей каталог містить додаткові каталоги з різними стилями (або темами) відображення. З веб-сайту screenlets.org можна завантажити шаблонстандартного screenlet'a з усіма необхідними файлами та каталогами.
Перший screenlet, розроблений на основі цього шаблону, буде стандартним "Hello World"-додатком. Вихідний код screenlet'a "Hello World" наведено у лістингу 1.
Listing 1. Python code для Hello World screenlet
Будь-яка програма повинна імпортувати бібліотеку screenlets і створити новий сеанс. Існують інші обов'язкові вимоги, що включають дії з ініціалізації та базову функцію draw для відображення віджету на екрані. У прикладіTestScreenlet.py є метод __init__, що ініціалізує об'єкт. У цьому методі міститься єдина інструкція, яка виконує виклик методу __init__ screenlet'a, який встановлює початкові значення для висоти та ширини вікна, створюваного для цієї програми.
Друга функція, необхідна роботи програми, - це метод on_draw . Ця процедура встановлює білий колір для фону прямокутника та виводить його на екран відповідно до заздалегідь встановлених розмірів. Далі в цьому методі задаються чорний колір шрифту і вихідне значення Hello World для тексту, який потім відображається у вікні програми. На малюнку 1 показаний результат запуску цього screenlet'a. Ця стандартна структура надалі буде використовуватися в статті як відправна точка для створення більш складних додатків.
Малюнок 1. Приклад простого screenlet'a
Повторне використання коду у більш складному screenlet'e
Корисною особливістю при розробці screenlet'ів є можливість використання коду з інших програм. Повторне використання забезпечує додаткові можливості, відкриваючи доступ до багатьох існуючих Python-проектів з відкритим вихідним кодом. Всі screenlet'и маютьоднаковою початковою структурою, але можуть містити додаткові методи підтримки різної функціональності. У лістингу 2 наведено приклад програмиTimeTrackerScreenlet.
Лістинг 2. Вихідний код TimeTrackerScreenlet
У цьому прикладі представлено кілька нових концепцій, знання яких знадобиться для розробки високофункціональних додатків. Всі screenlet'и можуть реагувати на певні дії користувача або події, такі як натискання кнопок миші або переміщення об'єктів на екрані. У цьому прикладі подія "кнопка миші натиснута" використовується як тригер для зміни стану піктограми. Під час запуску screenlet'a відображається піктограмаstart.png. При натисканні на зображення воно змінюється наstop.png, а час запуску записується в полі self.started . При повторному натисканні зображення воно змінюється назад наstart.png, а у вікні програми виводиться час, що минув з першого натискання.
Обробка подій - ще одна ключова особливість screenlet'ів, яка уможливлює розробку різноманітних додатків. Хоча в цьому прикладі використовується лише подія mouse_down , цей підхід можна застосовувати і для інших подій, що генеруються інфраструктурою screenlet'ів, або системних подій, таких як таймери. Інша ідея, представлена у цьому прикладі, – персистентний стан. Оскільки програма постійно працює, очікуючи на події для активації певної дії, вона може зберігати інформацію в пам'яті, наприклад, час першого натискання на піктограму. Також за потреби можна зберегти інформацію на диску для подальшого використання.
Автоматизація завдань за допомогою screenlet'ів
Після знайомства з основними можливостями screenlet'ів настав часперейти до їх практичного застосування. Сьогодні більшість користувачів використовує програми для отримання інформації з RSS-каналів для читання блогів або новин, що їх цікавлять. Як черговий приклад буде розроблений налаштований screenlet, що виконує моніторинг певних RSS-потоків за ключовими словами і відображає отримані результати в текстовому вікні. Ці результати будуть інтерактивні посилання, натискання на які відкриватиме відповідний матеріал у Web-браузері. У лістингу 3 наведено вихідний код "RSS Search"-screenlet'a.
Лістинг 3. Вихідний код screenlet'a для роботи з RSS-потоками
Крім фрагментів, вже знайомих за першими двома screenlet'ами, у цьому прикладі зустрічаються і нові ідеї, включаючи конфігураційну сторінку. У процедурі on_init додаються три опції, які повинні бути встановлені користувачем: список відстежуваних RSS-потоків, тема, за якою буде здійснюватися пошук, і період оновлення. Встановлені значення використовуються процедурою update під час роботи.
Мова Python ідеально підходить для вирішення таких завдань. Стандартна бібліотека включає все необхідне для завантаження XML-даних із RSS-потоку до списку для подальшого пошуку. У Python для цього знадобляться лише три рядки коду:
У результаті створюється список з об'єктів, що відповідають окремим елементам XML з ім'ям item . Тепер можна пройти по цьому списку в пошуку теми, що цікавить. У Python є елегантний спосіб проходу по списку елементів за допомогою циклу for , як показано нижче:
Кожен елемент, відповідний критерію пошуку, додається в список, що відображається, пов'язаний з цим екземпляром screenlet'a. Такий підхід дозволяє мати кілька одночасно працюючих екземплярів screenlet'a,кожен із яких виконує пошук з різних тем. Завершальна частина функції update перемальовує текст у списку, що оновлюється, і запускає новий таймер оновлення, використовуючи період оновлення, зазначений на конфігураційній сторінці. За замовчуванням таймер спрацьовує кожні 10 секунд, але це значення можна змінити будь-яке інше. Механізм для запуску таймерів береться з бібліотеки gobject, що входить до інфраструктури GTK.
Щоб реалізувати поставлені вимоги, знадобилося значно збільшити функціональність методу on_draw у цьому додатку. Обидві бібліотеки – Cairo та Pango – дозволяють додавати певні ефекти у вікно з текстом. Так, використання градієнтної заливки фону дозволяє створити «стильну» візуальну виставу із закругленими кутами та напівпрозорістю. За допомогою Pango до менеджера розміщення GUI-компонентів можна додати кілька функцій для збереження та відновлення поточного контексту. Ця бібліотека також надає спосіб створення масштабованих шрифтів залежно від поточного розміру screenlet'a.
Малюнок 2. Приклад screenlet'a


Висновок
За допомогою Python та screenlet'ів легко створювати корисні програми для робочого столу. Ймовірно, найскладніше буде освоїти API screenlet'ів та механізми передачі управління між різними функціями. Хоча відповідна документація - не найзручніше джерело інформації, вона містить усі відомості, необхідні для використання різних функцій. Можливо, краще відразу перейти до практичних експериментів, модифікуючи готові screenlet'и відповідно до ваших вимог.
Ресурси для скачування
Схожі теми
- Scripting the Linux desktop, Part 1: Basics: оригінал статті (EN).
- GTK+windowing toolkit for GNOME: домашня сторінка бібліотеки інтерфейсу користувача GTK+.
- Qt windowing toolkit for KDE: домашня сторінка бібліотеки користувальницького інтерфейсу Qt.
- Screenlets Web site: домашня сторінка технології screenlets з прикладами та шаблонами screenlet'ів та всією необхідною документацією.
- Python.org: основне джерело інформації про Python.
- Слідкуйте за публікаціями developerWorks у Твіттері або підпишіться на канал твітів Linux на developerWorks.