PythonHello, World с использованием PyGTK

В этой заметке мы напишем простейшее приложение с использованием библиотеки PyGTK и разберем, как оно работает.
Прежде всего нужно поставить соответствующий пакет. Обычно он называется python-gtk.
Заметка требует некоторых познаний в построении графического интерфейса.
import gtk

class HelloWorldApp():
      def close(self, widget, data=None):
          gtk.main_quit()

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

      def __init__(self):
           self.window = gtk.Window()
           self.window.connect("destroy", self.close)
           self.window.connect("delete_event", self.delete_event)
           self.button = gtk.Button("Hello!")
           self.button.connect("clicked", self.close)
           self.window.add(self.button)
           self.button.show()
           self.window.show()

      def main(self):
           gtk.main()
if __name__ == "__main__":
     app = HelloWorldApp()
     app.main()

Теперь разберем, для чего нужна каждая строка.
import gtk — подключаем модуль, в котором живут классы для работы с GTK.
def close(self, widget, data=None):
      gtk.main_quit() 
— эта функция будет обработчиком сигнала destroy, который окно получает при его закрытии. Метод main_quit() заканчивает работу приложения.
def delete_event(widget, event, data=None):
     print "delete event occurred"
     return False
— обработчик события, которое генерируется при закрытии окна. Событие и сигнал в GTK несколько разные вещи, но об этом нужно писать отдельно.
def __init__(self):
           — конструктор класса (метод, который будет выполнен при его иниализации)

     self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
      — создаем новое окно верхнего уровня.

     self.window.connect("destroy", self.close)
     self.window.connect("delete_event", self.delete_event)
     — назначаем методы close() и delete_event() обработчиками сигнала 
       destroy и события delete_event

     self.button = gtk.Button("Hello!")
     — создаем кнопку с надписью Hello!

     self.button.connect("clicked", self.close)
     — сигнал clicked кнопка получит при нажатии. Обработчиком этого сигнала
       азначим close()

     self.window.add(self.button)
     — добавляем кнопку к окну.

     self.button.show()
     self.window.show()
     — показываем окно и кнопку.

     if __name__ == "__main__":
        app = HelloWorldApp()
        app.main()
     — если мы находимся в основной программе, то создадим экземпляр класса 
       HelloWorldApp и запустим приложение.


По вашим заявкам могу написать более подробно. Официальная документация находится здесь: pygtk.org

Комментарии (11)

не совсем понял как это:
self.window.connect("delete_event", self.delete_event)
работает?
то есть я понимаю что оконный менеджер генерит событие/сигнал при нажатии на кнопку закрытия окна, вы связываете это событие с методом и все такое.
В методе delete_event вы ничего не делаете кроме print, почему тогда происходит gtk.main_quit()?

зы: первый раз вижу такое, простите за невежество :)
почитал тут, оказывается, насколько я понял, оконный менеджер, как и предполагалось, генерит сигнал delete_event, который вызывает функцию delete_event() и в случае когда функция возвращает False генерится сигнал destroy ну и дальше все понятно. Вот только в данном случае мне кажется, это лишнее, потому как если убрать из кода все что связано с delete_event то приложение продолжит работать так как нам нужно.
Я просто хотел показать, как пишутся обработчики событий и сигналов, и что они выглядят немного по-разному.
Конечно, здесь со второго обработчика пользы никакой, но для ознакомления пусть будет.
только начал изучать как работать c PyGTK+… спасибо…
Для сигнала 'destroy' нет необходимости вызывать метод self.close, лучше сразу убить процесс:
self.window.connect("destroy", gtk.main_quit)


А в PyGTK разве нет connect_simple? Я что-то не нашёл.
connect_simple я не нашел, но не особо и искал. Надо глянуть в доки.
Убить сразу можно, но мало ли чего еще захочется сделать при получении сигнала? Закрыть соединения, например, или еще чего-то в этом духе.
Поэтому я для всех обработчиков делаю отдельные методы, на случай если потребуется туда что-то еще дописать.
Ну и былокод.
Зачем self?
Зачем ЦЕЛУЮ ФУНКЦИЮ ради gtk.main()?
Зачем __init__?
Напиши свой пример с комментариями ;) И раскрой тему зла от ООП :)
#!/usr/bin/python
# -*- coding: utf-8 -*-

import gtk #импортируем библиотеку gtk

def close(widget):
  gtk.main_quit() #или exit() - выход

button = gtk.Button("Hello!") #создаем кнопку с надписью "Hello!", запихиваем ее в переменную button
button.connect("clicked", close) #выполнение close при нажатии на кнопку

window = gtk.Window() #создаем окно, запихиваем его в переменную window
window.connect("destroy", close) #выполнение close при нажатии на кнопку закрыть на коробке окна
window.add(button) #добавить кнопку button на форму

button.show() #грузим кнопку
window.show() #грузим форму

gtk.main() #грузим все это дело
Вот здорово, теперь есть 2 вариант и начинающие программисты выберут подходящий им :)
А какие тут варианты? Я убрал лишние строки и все (нет, я не писал все заново). Так проще, легче, читабельнее. Вот блин, будущих быдлокодеров что-ли учим?
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.