Содержание
В начале нашего знакомства с PyGTK мы напишем простейшую программу. Программа (base.py) создаст окно 200х200 пикселей для закрытия которой нужно использовать среду.
#!/usr/bin/env python # -*- coding: utf-8 -*- # пример base.py import pygtk pygtk.require('2.0') import gtk class Base: def __init__(self): self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) self.window.show() def main(self): gtk.main() print __name__ if __name__ == "__main__": base = Base() base.main()
Вы можете запустить программу вводом:
python base.py |
Если base.py имеет права на выполнение и Python может быть найден в директории PATH вашего окружения он может быть запущен с помощью команды:
base.py |
Строка 1 подключает python для запуска base.py в своём окружении. Вторая строка говорит интерпретатору Python о том, какую кодировку следует использовать, распознавая символы, отличные от ASCII, в тексте программы. То есть без явного указания кодировки мы не смогли бы писать комментарии в коде на русском языке. Строки 5-6 помогают отличить программы написанные для различных версий PyGTK. Эти строки показывают что мы хотим использовать PyGTK версии 2.0, которая покрывает все версии PyGTK 2.X. Это защищает программу от использования с устаревшей версией PyGTK если она установлена в систему. Строки 18-20 проверяют, если переменная __name__ равна "__main__", то это означает, что данная программа была прямо запущена в python окружении, а не была импортирована как модуль. В этом случае программа создаёт новый экземпляр класса Base и сохраняет ссылку на него в переменной base. Затем вызывается метод main() для запуска цикла обработки событий GTK+.
Должно отобразиться окно похожее на Рисунок 2.1, “Простое окно PyGTK”
Первая строка base.py позволяет запускать программу в *nix окружении через интерпретатор python поиск которого происходит в переменной окружения PATH. Эта строка будет первой во всех примерах.
Строки 5-7 импортируют модуль PyGTK 2 и инициализируют окружение GTK+. Модуль PyGTK назначает интерфейсы python для функций GTK+ которые будут использованы в программе. Это похоже на инициализацию GTK+ и включает в себя вызов функции gtk_init(). Что, в свою очередь, устанавливает некоторые параметры, такие как стандартные настройки визуального оформления, обработчики сигналов, и проверяет параметры переданные приложению в командной строке, и ищет один или несколько из следующих:
- –gtk-module
- –g-fatal-warnings
- –gtk-debug
- –gtk-no-debug
- –gdk-debug
- –gdk-no-debug
- –display
- –sync
- –name
- –class
Происходит удаление найденного из списка параметров, передающихся приложению. Это стандартные параметры принятые для всех GTK+ приложений.
Строки 9-15 определяют класс python с именем Base , в котором определяется инициализирующий метод класса __init__() – так называемый констуктор. Функция __init__() создаёт окно переднего плана (строка 11) и приказывает GTK+ отобразить его (строка 12). gtk.Window, созданный в 11 строке с аргументом gtk.WINDOW_TOPLEVEL указывает на то, что мы хотим получить оформление и размещение окна от менеджера окон. Создание окна с размерами 200х200 по-умолчанию предпочтительнее чем создание окна 0х0, но вы всегда можете этим управлять.
Строки 14-15 определяют метод main() который вызывает функцию PyGTK main(), которая позволяет основному циклу обработки событий GTK+ отлавливать события мыши и клавиатуры также хорошо как и оконные
Строки 18-20 позволяют программе запускаться автоматически если она была вызвана напрямую или подана как аргумент интерпретатору python. В таком случае имя программы находящееся в переменной __name__ будет строкой "__main__", и код в сткроках 18-20 выполнится. Если программа была импортирована в работающий интерпретатор python с помощью выражения import, строки 18-20 не будут выполнены.
Строка 19 создаёт экземпляр класса Base с именем base. gtk.Window создаётся и отображает результат.
Строка 20 вызывает метод main() класса Base который запускает цикл обработки событий GTK+. Когда управление дойдёт до этой точки, GTK+ будет ожидать событий среды (таких как, нажатие кнопок или клавиш), timeout или file IO уведомлений. В нашем простом примере события игнорируются.
Теперь о программе с виджетом (кнопкой). Это версия классической программы “Привет, Мир!”, в англоязычной версии – Hello World (helloworld.py ) для PyGTK.
#!/usr/bin/env python # -*- coding: utf-8 -*- # пример helloworld.py import pygtk pygtk.require('2.0') import gtk class HelloWorld: # Это функция обратного вызова. Параметры игнорируются # в этом примере. Подробнее о функциях обратного вызова ниже. def hello(self, widget, data=None): print "Привет, Мир!" def delete_event(self, widget, event, data=None): # Если вы возвращаете FALSE в обработчике "delete_event", # GTK отправит сигнал "destroy". Возвращение TRUE означает # что вы не хотите чтобы окно было уничтожено. # Это удобно использовать для всплывающих окон # type dialogs. print "delete event occurred" # Измените с FALSE на TRUE И главное окно не будет уничтожено # обработчиком "delete_event". return False # Другие обратный вызов. def destroy(self, widget, data=None): gtk.main_quit() def __init__(self): # Создание нового окна self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) # Когда окно получает сигнал "delete_event" (Его отправляет # оконный менеджер, обычно при выборе опции закрытия, # мы запрашиваем его для вызова функции delete_event () # определённой выше. Данные нужные функции обратного вызова # равны NULL и они в ней игнорируются. self.window.connect("delete_event", self.delete_event) # Здесь мы подключаем событие "destroy" у обработчику сигнала. # Это событие выполняется при вызове gtk_widget_destroy() в окне, # или если мы возвратим FALSE в функции "delete_event". self.window.connect("destroy", self.destroy) # Задаёт толщину границы окна. self.window.set_border_width(10) # Создаёт новую кнопку с надписью "Привет, Мир!". self.button = gtk.Button("Привет, Мир!") # Когда кнопка получает сигнал "clicked", она вызывает # функцию hello() передавая ей None как аргумент. # Функция hello() определена выше. self.button.connect("clicked", self.hello, None) # Это заставит окно уничтожиться в следствие вызова # gtk_widget_destroy(window) когда "clicked". Ещё раз, # сигнал может быть получен отсюда, или из менеджера окон. self.button.connect_object("clicked", gtk.Widget.destroy, self.window) # Это размещает кнопку в окне GTK (Контейнер GTK). self.window.add(self.button) # Последним щагом будет отображение созданной кнопки. self.button.show() # и окна self.window.show() def main(self): # Все приложения PyGTK должны иметь gtk.main(). Выполнение здесь останавливается # и начинает ожидать событий (например нажатия кнопки). gtk.main() # Если программа запускается напрямую или передаётся аргументом интерпретатору python # Нужно создать экземпляр HelloWorld и показать его if __name__ == "__main__": hello = HelloWorld() hello.main()
Рисунок 2.2, “Пример программы ‘Привет, Мир!’” показывает окно, создаваемое helloworld.py.
Переменные и функции, определённые в модуле PyGTK, имеют название gtk.*. Например, в программе helloworld.py использовались:
False gtk.mainquit() gtk.Window() gtk.Button() |
из модуля PyGTK. В следующих разделах мы не будем указывать префикc gtk, но он будет подразумеваться. В примерах, конечно, этот префикс будет присутствовать, так как иначе – они бы просто не работали.
Предыдущая страница | На уровень выше | Следующая страница |
Глава 1. Введение | К оглавлению | 2.2. Теория сигналов и обратных вызовов |