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 вариант и начинающие программисты выберут подходящий им :)
А какие тут варианты? Я убрал лишние строки и все (нет, я не писал все заново). Так проще, легче, читабельнее. Вот блин, будущих быдлокодеров что-ли учим?
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.