Начало работы

В начале нашего знакомства с 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”

Рисунок 2.1, “Простое окно PyGTK”

Simple PyGTK Window

Первая строка 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 уведомлений. В нашем простом примере события игнорируются.

2.1. “Привет, Мир!” в PyGTK

Теперь о программе с виджетом (кнопкой). Это версия классической программы “Привет, Мир!”, в англоязычной версии – 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.

Рисунок 2.2. Пример программы Привет, Мир!

Hello World Example Program

Переменные и функции, определённые в модуле PyGTK, имеют название gtk.*. Например, в программе helloworld.py использовались:

  False
  gtk.mainquit()
  gtk.Window()
  gtk.Button()

из модуля PyGTK. В следующих разделах мы не будем указывать префикc gtk, но он будет подразумеваться. В примерах, конечно, этот префикс будет присутствовать, так как иначе – они бы просто не работали.


Предыдущая страница На уровень выше  Следующая страница
Глава 1. Введение К оглавлению  2.2. Теория сигналов и обратных вызовов

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>