Пошаговый разбор Hello World

Теперь, когда мы знаем теорию, давайте попробуем разобраться в нашем примере helloworld.py.

Строки 9-76 определяют класс HelloWorld который содержит все обратные вызовы как методы объекта и его конструктор. Давайте рассмотрим эти методы.

Строки 13-14 определяют callback метод hello(), который будет вызван после клика по кнопке. Тогда вызванный метод напишет в консоли “Hello world”. В этом примере мы игнорируем экземпляр объекта, параметры widget и data, но большинство обратных вызовов будут их использовать. Параметр data определён со стандартным значением None потому, что если PyGTK не получит data в вызове connect(), то это приведёт к ошибке, поскольку ожидается 3 параметра, а получить можно и 2. Установка значения None позволяет выполнять обратные вызовы с двумя или тремя параметрами без ошибок. В этом случае параметр data может быть не указан, а метод hello() всегда будет вызываться только с двумя параметрами. Следующий пример будет использовать data argument для того чтобы сказать нам, какая же кнопка нажата.

  def hello(self, widget, data=None):
      print "Привет, Мир!"

Следующая callback функция (строки 16-26) немного особенная. Событие “delete_event” происходит тогда, когда оконный менеджер посылает событие приложению о его закрытии. Мы можем выбрать, что же сделать с этими событиями. Мы можем их игнорировать, можем как-либо ответить на них или просто закрыть приложение.

Возвращаемое значение, позволяет GTK+ знать что же выбирает приложение. Возвращая TRUE, мы даём знать что мы не хотим принимать сигнал “destroy”, и продолжаем выполнение нашего приложения. Возвращая FALSE, мы просим по сигналу “destroy” вызвать наш обработчик сигнала “destroy”. Комментарии были удалены для большей ясности.

  def delete_event(widget, event, data=None):
      print "delete event occurred"
      return False

Callback метод destroy() (строки 28-30) заставляет программу выйти по вызову gtk.main_quit(). Эта функция сообщает GTK+ о выходе из gtk.main() когда к нему вернётся управление.

  def destroy(widget, data=None):
      print "destroy signal occurred"
      gtk.main_quit()

Строки 32-71 определяют объект HelloWorld с конструктором __init__(), который создаёт окно и виджеты используемые программой.

Строка 34 создаёт новое окно, но оно не будет отображаться, пока мы не прикажем GTK+ показать окно ближе к концу текста программы. Ссылка на окно сохраняется в поле объекта для доступа к нему позднее.

  self.window =
gtk.Window(gtk.WINDOW_TOPLEVEL)

Строки 41 и 46 иллюстрируют 2 примера присоединения к объекту обработчика сигнала, в данном случае к window. Здесь отлавливаются сигналы “delete event” и “destroy”. Первый излучается, когда мы закрываем окно в оконном менеджере, или используем метод GtkWidget destroy(). Второй излучается, когда мы возвращаем FALSE в методе “delete_event”.

    self.window.connect("delete_event", self.delete_event)
    self.window.connect("destroy", self.destroy)

Строка 49 устанавливает параметр для объекта-контейнера (в нашем случае window), устанавливающий 10 пикселей свободного места возле границ, куда не может быть помещён виджет. Есть похожие методы, которые мы рассмотрим в Главе 18, Настройка параметров виджетов

    self.window.set_border_width(10)

Строка 52 создаёт новую кнопку и сохраняет ссылку на неё в self.button. Кнопка будет иметь надпись “Привет, Мир!”, когда будет отображена.

    self.button = gtk.Button("Привет, Мир!")

В строке 57 мы присоединяем к кнопке обработчик сигнала так, что он излучит сигнал “clicked”, и вызовется наш callback метод hello(). Мы не передаём методу hello() никаких данных, поэтому просто отправляем None как данные. Очевидно, что сигнал “clicked” излучаться кликом по кнопке курсором мыши. Значение параметра None не требуется, и может быть удалено. Callback должен будет вызываться с меньшим числом параметров.

    self.button.connect("clicked", self.hello, None)

Также мы хотим использовать эту кнопку для выхода из программы. Строка 62 показывает как сигнал “destroy” может быть получен от оконного менеджера или от нашей программы. Когда кнопка нажата, как показано выше, это сначала вызовет функцию hello(), и затем следующую, в том порядке как вы указали. Вы можете иметь столько callback методов, сколько вам нужно, и все они запустятся в том порядке, в котором вы их присоединили.

Когда мы хотим использовать метод GtkWidget destroy(), который принимает один аргумент (в данном случае уничтожается window), мы используем метод connect_object() и передаём ему ссылку на окно. Метод connect_object() передаёт window как первый callback параметр вместо кнопки.

Когда вызывается метод gtk.Widget destroy() от окна, которое нам нужно закрыть, то излучается сигнал “destroy”, который передаёт управление методу HelloWorld destroy(), в свою очередь, который приводит к завершению программы.

    self.button.connect_object("clicked", gtk.Widget.destroy, self.window)

Строка 65 это вызов компоновки, которая будет детально объяснена позже, в Главе 4, Компоновка виджетов . Но это довольно легко для понимания. Просто указываем GTK+, что кнопка должна быть помещена в окно, в котором она будет отображена. Заметим, что контейнер GTK+ может содержать только один виджет. Правда, существуют другие виджеты, которые будут объяснены позднее, специально созданные для размещения нескольких виджетов различными способами.

    self.window.add(self.button)

Сейчас у нас всё настроено так как нам нужно. Кнопка с обработчиками событий помещена на окно, теперь нам нужно попросить GTK+ (строки 66 и 69) показать эти виджеты на экране. Окно мы показываем последним, потому что лучше показать готовое окно чем показывать пустое окно а затем рисовать на нём кнопку. Даже с таким простым примером это лучше не забывать и взять себе за правило.

    self.button.show()

    self.window.show()

Строки 73-75 определяют метод main(), который вызывает функцию gtk.main()

    def main(self):
        gtk.main()

Строки 80-82 позволяет программе запускаться, если она вызвана напрямую или как аргумент к интерпретатору python. Строка 81 создаёт экземпляр класса HelloWorld и сохраняет ссылку на него в переменной hello. Строка 82 вызывает метод main() класса HelloWorld, для того чтобы начать цикл обработки событий GTK+.

    if __name__ == "__main__":
        hello = HelloWorld()
        hello.main()

Теперь, когда мы кликаем мышью по кнопке, виджет излучает сигнал “clicked”, по которому вызывается метод hello() с аргументом None, и вызывается следующий обработчик этого сигнала. Следующий обработчик вызывает функцию виджета destroy() с ссылкой на окно, как на аргумент, что заставляет окно испускать сигнал “destroy”, по которому вызывается наш метод HelloWorld.destroy().

Другим возможным событием является закрытие окна, используя оконный менеджер, что излучает событие “delete_event”. Это в свою очередь вызовет наш обработчик “delete_event”. Если мы вернём TRUE, то окно останется как есть, и ничего не произойдёт. Если мы вернём FALSE это заставит GTK+ испустить сигнал “destroy”, что вызовет callback HelloWorld “destroy” и произойдёт выход.


Предыдущая страница На уровень выше  Следующая страница
2.3. События Оглавление  Глава 3. Двигаемся дальше

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

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

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