PyGTK - набор Python-привязок для библиотеки GTK+

PyGTK — набор Python-привязок для библиотеки GTK+. PyGTK является свободным ПО и распространяется на условиях GNU LGPL. Библиотека была выбрана в качестве официального инструментария разработки для программы «Ноутбук за 100 долларов». Начиная с версии 2.8, обёртки объектов GLib вынесены в отдельную библиотеку — PyGObject.

Пример: программа Hello World

   1 #!/usr/bin/env python2
   2 #-*- coding: UTF-8 -*-
   3  
   4 import gtk
   5  
   6 def button_clicked(button):
   7     print 'Hello World!'
   8  
   9 def main():
  10         window = gtk.Window()
  11         window.set_default_size(240, 180)
  12         window.set_title('Hello World!')
  13         window.connect('destroy', lambda w: gtk.main_quit())
  14  
  15         button = gtk.Button('Press Me')
  16         button.connect('clicked', button_clicked)
  17         button.show()
  18  
  19         window.add(button)
  20         window.present()
  21  
  22         gtk.main()
  23  
  24 if __name__ == '__main__':
  25         main()

PyGTK-Screenshot-Hello-World.png

Особенности сборки мусора

GTK+ реализован на языке C и имеет собственную (не интегрированную в полной мере с Python) систему учёта ссылок между GObject-объектами, для удаления более-неиспользуемых Gtk-объектов (т.е. для обработки этих объектов Системой Сборки Мусора GObject). Как следствие этого -- не исключены случаи, когда ссылки на Python-объекты (например ссылки на функции обратного вызова), сохранённые внутри Gtk-объектов (то есть GObject-объектах), превращаются в слабые ссылки, и могут быть удалены Системой Сборки Мусора Python. Следствием непредусмотренного программистом превращения ссылок в слабые ссылки -- могут стать ошибки при выполнении программы, когда, например, вызванная Callback-функция станет оперировать с неинициализированными данными (то есть с данными очищенными Сборщиком Мусора Python).

Превращение ссылок в слабые ссылки НЕ будет происходить, пока Gtk-объект всё ещё описывается в Python-программе как PyGtk-объект (то есть пока алгоритм программы не исключает из области видимости ссылки на Python-объект, описывающий Gtk-объект). Однако Gtk-объекты добавляя себя в качестве дочерних для других Gtk-объектов -- не сохраняют ссылку на своё Python-описание. Впрочем, программист может сделать это (сохранить Python-описание Gtk-объекта) самостоятельно, как, например, это было сделано в описанном выше примере программы Hello World. Другим способом страховки от паразитных явлений при превращении ссылок на Python-функции в слабые ссылки, может быть и методология: когда Gtk-объекты оперируют только со ссылками на Python-функции, которые в явном виде сохранены в области видимости Python-программы (при этом сохранять ссылки на сами PyGtk-объекты -- необходимости уже нет).

Пакеты/GUI/PyGTK (последним исправлял пользователь alafin 2010-05-30 17:40:22)