В этой статье я расскажу о компоновке элементов интерфейса в PyGTK. Мы будем использовать дизайнер интерфейсов Glade и сделаем первое кросплатформенное приложение на PyGTK.
Сперва несколько слов о подготовке Windows-машины: установим всё необходимое для разработки.
Если у вас не установлен Python, и нет желания скачивать всё по отдельности, качайте полный архив всего, что нужно для Windows (20 Мб), который я залил на Яндекс. Все файлы проверены ClamWin. Ставьте в порядке, описанном ниже:
В Ubuntu нужно поставить пакет glade-3:
Я использую Ubuntu, поэтому все последующие скриншоты процесса разработки сделаны в Ubuntu. Тем не менее, в Windows Glade работает аналогично, никакой разницы нет.
Есть два основных вида компоновки (деление на 3 области тут сделано для примера, может быть задано произвольное количество областей):
Чтобы сразу понять, как это работает, посмотрите на картинку с горизонтальной компоновкой, и представьте, что это макет «резинового» сайта. Если вы увеличите размеры окна, области расширятся, и наоборот.
Промежутки задаются в пикселах, поэтому они всегда остаются одинаковыми.
Цифры внутри областей являются их порядковыми номерами. Как вы уже поняли, нумерация начинается с нуля и идёт слева направо и сверху вниз.
Glade — это визуальный редактор интерфейсов, он сохраняет дерево элементов в XML файл. Этот XML файл читается программой, и PyGTK создаёт реальные окна и виджеты на экране. Таким образом, с интерфейсом приложения можно работать отдельно от логики. Это правильный подход.
Запустим GLade (в Windows программа glade-3.exe, о чём я уже писал выше) и попробуем сделать что-то на основе HBox. Для начала добавим окно:

выберем горизонтальную компоновку:

оставим количество областей по умолчанию, появится горизонтальная компоновка с 3 областями:

в правой части экрана находится дерево элементов нашего интерфейса и редактор свойств выделенного элемента. Выберем hbox1 (только что созданную горизонтальную компоновку)

В редакторе свойств «Интервал» задаёт промежутки в пикселах между областями для размещения элементов, «Гомогенность» определяет, будут ли все области одинакового размера, «Число элементов» задаёт количество областей. Оставим всё, как есть.
У GTK есть такая интересная особенность: если мы в текстовое поле будем добавлять строки, и дойдём до конца видимой области, текстовое поле начнёт увеличиваться по высоте, и в конце концов выйдет за пределы экрана. Чтобы этого не происходило, нужно поместить текстовое поле в область прокрутки. Область прокрутки автоматически покажет скроллы, если текста больше, чем помещается на экране, и уберёт, если меньше.
Добавим в области 0 и 2 (т.е. в крайние области) область прокрутки:


в каждую область прокрутки поместим редактор текста:


Теперь в оставшуюся пустой среднюю область добавим ещё один элемент компоновки, вертикальную группу кнопок c 2 элементами:


Поменяем стиль размещения кнопок на «Рассеивание»:


так интерфейс выглядит более органично.
Добавим в каждую ячейку по кнопочке:


В редакторе свойств кнопки button1 поменяем метку на «Туда ->», а для кнопки button2 на "< — Сюда":


При нажатии кнопки GTK отправит сигнал. Чтобы получить его и обработать, необходимо дать сигналу имя. Выберем button1 и перейдём на закладку «Сигналы». Назовём сигнал нажатия кнопки button1 «button1_clicked_cb», а кнопки button2 «button2_clicked_cb»:

В общем-то, почти всё готово, кроме одной мелочи: главное окно не имеет нормального названия, и оно невидимое :-)
Исправим это, и заодно зададим начальные размеры окна:


Вот, в общем-то, и всё, первый интерфейс в стиле хабра готов. Сохраним его в файл pygtk001.glade. Расширение glade означает, что это файл в формате glade. Вы можете скачать готовый файл, который сделал я.
Интерфейс, который мы создали, может использоваться для каких-то операций с текстом. Например, перевод с одного языка на другой, шифровка и расшифровка и так далее. Интерфейс находится в файле pygtk001.glade, теперь нужно его оживить с помощью кода. Наша программа будет очень умной, она будет уметь перемещать текст туда-сюда :-)
Код очень простой (проверок нет, т.к. это не «боевая» программа), всего 50 строчек, с комментариями 60:
Скачать файл исходников.
Запускаем под Ubuntu:

Запускаем под Windows:

(у меня немного отрегулированы размеры шрифтов в Windows, поэтому немножко нестандартно)
Мы немножко узнали о том, какие виды компоновок есть в PyGTK, сделали простой GUI с помощью Glade, и запустили его под Ubuntu и Windows XP. Всё работает, как положено :-)
В следующих статьях мы продолжим знакомство с PyGTK, жду ваших отзывов.
Подготовка
Сперва несколько слов о подготовке Windows-машины: установим всё необходимое для разработки.
Если у вас не установлен Python, и нет желания скачивать всё по отдельности, качайте полный архив всего, что нужно для Windows (20 Мб), который я залил на Яндекс. Все файлы проверены ClamWin. Ставьте в порядке, описанном ниже:
- Python: Python 2.5.2 Windows installer. Версию Python я указываю ту, под которую в момент написания статьи есть инсталляторы PyGTK для Windows. Т.е., для беспроблемной установки. Если вы видите, что есть PyGTK под 2.6 или более позднюю версию, скачивайте её.
- GTK+: скачиваем полную сборку GTK+ для Windows (gtk+-win32-runtime), устанавливаем.
- Теперь скачиваем и ставим PyCairo, PyGObject и PyGTK для Windows. Прямые ссылки для версии Python 2.5.х: PyCairo, PyGObject, PyGTK
- Ну, и наконец, Glade. Берём glade-win32, распаковываем (например, C:\GTK\glade). В каталоге bin находится программа, glade-3.exe (до перезагрузки машины она у вас вряд ли заработает)
В Ubuntu нужно поставить пакет glade-3:
sudo apt-get install glade-3
Я использую Ubuntu, поэтому все последующие скриншоты процесса разработки сделаны в Ubuntu. Тем не менее, в Windows Glade работает аналогично, никакой разницы нет.
Горизонтальная и вертикальная
Есть два основных вида компоновки (деление на 3 области тут сделано для примера, может быть задано произвольное количество областей):
Горизонтальная | Вертикальная |
---|---|
![]() |
![]() |
Чтобы сразу понять, как это работает, посмотрите на картинку с горизонтальной компоновкой, и представьте, что это макет «резинового» сайта. Если вы увеличите размеры окна, области расширятся, и наоборот.
Промежутки задаются в пикселах, поэтому они всегда остаются одинаковыми.
Цифры внутри областей являются их порядковыми номерами. Как вы уже поняли, нумерация начинается с нуля и идёт слева направо и сверху вниз.
Glade
Glade — это визуальный редактор интерфейсов, он сохраняет дерево элементов в XML файл. Этот XML файл читается программой, и PyGTK создаёт реальные окна и виджеты на экране. Таким образом, с интерфейсом приложения можно работать отдельно от логики. Это правильный подход.
Запустим GLade (в Windows программа glade-3.exe, о чём я уже писал выше) и попробуем сделать что-то на основе HBox. Для начала добавим окно:

выберем горизонтальную компоновку:

оставим количество областей по умолчанию, появится горизонтальная компоновка с 3 областями:

в правой части экрана находится дерево элементов нашего интерфейса и редактор свойств выделенного элемента. Выберем hbox1 (только что созданную горизонтальную компоновку)

В редакторе свойств «Интервал» задаёт промежутки в пикселах между областями для размещения элементов, «Гомогенность» определяет, будут ли все области одинакового размера, «Число элементов» задаёт количество областей. Оставим всё, как есть.
Область прокрутки, редактор текста
У GTK есть такая интересная особенность: если мы в текстовое поле будем добавлять строки, и дойдём до конца видимой области, текстовое поле начнёт увеличиваться по высоте, и в конце концов выйдет за пределы экрана. Чтобы этого не происходило, нужно поместить текстовое поле в область прокрутки. Область прокрутки автоматически покажет скроллы, если текста больше, чем помещается на экране, и уберёт, если меньше.
Добавим в области 0 и 2 (т.е. в крайние области) область прокрутки:


в каждую область прокрутки поместим редактор текста:


Вертикальная группа кнопок
Теперь в оставшуюся пустой среднюю область добавим ещё один элемент компоновки, вертикальную группу кнопок c 2 элементами:


Поменяем стиль размещения кнопок на «Рассеивание»:


так интерфейс выглядит более органично.
Кнопки, сигналы
Добавим в каждую ячейку по кнопочке:


В редакторе свойств кнопки button1 поменяем метку на «Туда ->», а для кнопки button2 на "< — Сюда":


При нажатии кнопки GTK отправит сигнал. Чтобы получить его и обработать, необходимо дать сигналу имя. Выберем button1 и перейдём на закладку «Сигналы». Назовём сигнал нажатия кнопки button1 «button1_clicked_cb», а кнопки button2 «button2_clicked_cb»:

В общем-то, почти всё готово, кроме одной мелочи: главное окно не имеет нормального названия, и оно невидимое :-)
Исправим это, и заодно зададим начальные размеры окна:


Вот, в общем-то, и всё, первый интерфейс в стиле хабра готов. Сохраним его в файл pygtk001.glade. Расширение glade означает, что это файл в формате glade. Вы можете скачать готовый файл, который сделал я.
Первая работающая программа
Интерфейс, который мы создали, может использоваться для каких-то операций с текстом. Например, перевод с одного языка на другой, шифровка и расшифровка и так далее. Интерфейс находится в файле pygtk001.glade, теперь нужно его оживить с помощью кода. Наша программа будет очень умной, она будет уметь перемещать текст туда-сюда :-)
Код очень простой (проверок нет, т.к. это не «боевая» программа), всего 50 строчек, с комментариями 60:
#!/usr/bin/env python # coding: utf-8 import sys import os try: import pygtk pygtk.require('2.0') except: sys.exit(1) try: import gtk import gtk.glade except: sys.exit(1) class App: def __init__(self): # Загружаем файл интерфейса self.gladefile = "pygtk001.glade" # дерево элементов интерфейса self.widgetsTree = gtk.glade.XML(self.gladefile) # Словарик, задающий связи событий с функциями-обработчиками dic = { "button1_clicked_cb" : self.text_operation, "button2_clicked_cb": self.text_operation, } # Магическая команда, соединяющая сигналы с обработчиками self.widgetsTree.signal_autoconnect(dic) # Соединяем событие закрытия окна с функцией завершения приложения self.window = self.widgetsTree.get_widget("window1") if (self.window): self.window.connect("destroy", self.close_app) # А это уже логика приложения. Задём маршруты обработки текста для каждой кнопки. # Первый элемент - имя виджета-источника текста, второй - имя виджета-получателя self.routes = {'button1': ('textview1','textview2'), 'button2': ('textview2','textview1')} def text_operation(self,widget): "Функция, которая перебрасывает текст туда-сюда" # виджет-источник source = self.widgetsTree.get_widget(self.routes[widget.name][0]) # виджет-получатель destination = self.widgetsTree.get_widget(self.routes[widget.name][1]) # текстовый буфер источника source_text_buffer = source.get_buffer() # массив итераторов границ текста в текстовом буфере источника (начало и конец) source_text_buffer_bounds = source_text_buffer.get_bounds() # собственно текст source_text = source_text_buffer.get_text(source_text_buffer_bounds[0], source_text_buffer_bounds[1]) # устанавливаем текст в текстовом буфере виджета-получателя destination.get_buffer().set_text(source_text) # очищаем текстовый буфер источника source_text_buffer.set_text('') def close_app(self, widget): gtk.main_quit() if __name__ == "__main__": app = App() gtk.main()
Скачать файл исходников.
Запускаем под Ubuntu:

Запускаем под Windows:

(у меня немного отрегулированы размеры шрифтов в Windows, поэтому немножко нестандартно)
Итоги
Мы немножко узнали о том, какие виды компоновок есть в PyGTK, сделали простой GUI с помощью Glade, и запустили его под Ubuntu и Windows XP. Всё работает, как положено :-)
В следующих статьях мы продолжим знакомство с PyGTK, жду ваших отзывов.