В этой заметке мы напишем простейшее приложение с использованием библиотеки PyGTK и разберем, как оно работает.
Прежде всего нужно поставить соответствующий пакет. Обычно он называется python-gtk.
Заметка требует некоторых познаний в построении графического интерфейса.
— обработчик события, которое генерируется при закрытии окна. Событие и сигнал в 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
работает?
то есть я понимаю что оконный менеджер генерит событие/сигнал при нажатии на кнопку закрытия окна, вы связываете это событие с методом и все такое.
В методе delete_event вы ничего не делаете кроме print, почему тогда происходит gtk.main_quit()?
зы: первый раз вижу такое, простите за невежество :)
почитал тут, оказывается, насколько я понял, оконный менеджер, как и предполагалось, генерит сигнал delete_event, который вызывает функцию delete_event() и в случае когда функция возвращает False генерится сигнал destroy ну и дальше все понятно. Вот только в данном случае мне кажется, это лишнее, потому как если убрать из кода все что связано с delete_event то приложение продолжит работать так как нам нужно.
Я просто хотел показать, как пишутся обработчики событий и сигналов, и что они выглядят немного по-разному.
Конечно, здесь со второго обработчика пользы никакой, но для ознакомления пусть будет.
connect_simple я не нашел, но не особо и искал. Надо глянуть в доки.
Убить сразу можно, но мало ли чего еще захочется сделать при получении сигнала? Закрыть соединения, например, или еще чего-то в этом духе.
Поэтому я для всех обработчиков делаю отдельные методы, на случай если потребуется туда что-то еще дописать.
#!/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() #грузим все это дело
А какие тут варианты? Я убрал лишние строки и все (нет, я не писал все заново). Так проще, легче, читабельнее. Вот блин, будущих быдлокодеров что-ли учим?
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.
то есть я понимаю что оконный менеджер генерит событие/сигнал при нажатии на кнопку закрытия окна, вы связываете это событие с методом и все такое.
В методе delete_event вы ничего не делаете кроме print, почему тогда происходит gtk.main_quit()?
зы: первый раз вижу такое, простите за невежество :)
Конечно, здесь со второго обработчика пользы никакой, но для ознакомления пусть будет.
А в PyGTK разве нет connect_simple? Я что-то не нашёл.
Убить сразу можно, но мало ли чего еще захочется сделать при получении сигнала? Закрыть соединения, например, или еще чего-то в этом духе.
Поэтому я для всех обработчиков делаю отдельные методы, на случай если потребуется туда что-то еще дописать.
Зачем self?
Зачем ЦЕЛУЮ ФУНКЦИЮ ради gtk.main()?
Зачем __init__?