Перейти к содержанию

PyGTK

Эта статья находится на начальном уровне проработки, в одной из её версий выборочно используется текст из источника, распространяемого под свободной лицензией
Материал из энциклопедии Руниверсалис
PyGTK
Тип разработка графического интерфейса
Автор James Henstridge
Johan Dahlin
Разработчик сообщество
Разработчики сообщество
Написана на Python, C
Операционная система Linux и др. UNIX-подобные, Windows
Состояние активное
Лицензия GNU LGPL
Сайт pygtk.org

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

Начиная с версии 2.8, обёртки объектов GLib вынесены в отдельную библиотеку — PyGObject, которая должна полностью вытеснить PyGTK при использовании GTK+ версии 3. Хотя PyGTK является стабильной, достаточно развитой и одной из четырёх основных библиотек графического интерфейса для Python, её разработка была остановлена авторами в 2011 году[1], пользователям было рекомендовано переходить на PyGObject[2].

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

Этот пример приведён для Python версии 2.x. Другие примеры можно найти в архиве с исходными кодами PyGTK, в папке examples.

#!/usr/bin/env python
#-*- coding: UTF-8 -*-

import gtk

def button_clicked(button):
    print 'Hello World!'

def main():
    window = gtk.Window()
    window.set_default_size(240, 180)
    window.set_title('Hello World!')
    window.connect('destroy', lambda w: gtk.main_quit())

    button = gtk.Button('Press Me')
    button.connect('clicked', button_clicked)
    button.show()

    window.add(button)
    window.present()

    gtk.main()

if __name__ == '__main__':
    main()
Результат выполнения программы

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

GTK+ реализован на языке C и имеет собственную (не интегрированную в полной мере с Python) систему учёта ссылок между GObject-объектами для удаления более не используемых GTK-объектов (то есть для обработки этих объектов системой сборки мусора GObject).

Как следствие этого — не исключены случаи, когда ссылки на Python-объекты (например, ссылки на функции обратного вызова), сохранённые внутри GTK-объектов (то есть GObject-объектах), превращаются в слабые ссылки и могут быть удалены системой сборки мусора Python.[3]

Следствием непредусмотренного программистом превращения ссылок в слабые ссылки могут стать ошибки при выполнении программы, когда, например, вызванная Callback-функция станет оперировать с неинициализированными данными (то есть с данными, очищенными сборщиком мусора Python).

Превращение ссылок в слабые ссылки не будет происходить, пока GTK-объект всё ещё описывается в Python-программе как PyGTK-объект (то есть пока алгоритм программы не исключает из области видимости ссылки на Python-объект, описывающий GTK-объект). Однако GTK-объекты, добавляя себя в качестве дочерних для других GTK-объектов, не сохраняют ссылку на своё Python-описание. Впрочем, программист может сделать это (сохранить Python-описание GTK-объекта) самостоятельно, как, например, это было сделано в описанном выше примере программы Hello World[4].

Другим способом страховки от паразитных явлений при превращении ссылок на Python-функции в слабые ссылки может быть и методология: когда GTK-объекты оперируют только со ссылками на Python-функции, которые в явном виде сохранены в области видимости Python-программы (при этом сохранять ссылки на сами PyGTK-объекты — необходимости уже нет).

См. также

Примечания

  1. Summerfield, M. Python in Practice: Create Better Programs Using Concurrency, Libraries, and Patterns. — Pearson Education, 2013. — P. 232. — ISBN 9780133373233.
  2. PyGTK: GTK+ for Python (официальный сайт). Дата обращения: 7 июня 2011. Архивировано 15 июня 2011 года.
  3. Это явление упоминается также и в руководстве модуля ctypes, предназначенного для прозрачного взаимодействия Python-программы с двоичным C-кодом: ctypes — A foreign function library for Python Архивная копия от 15 октября 2012 на Wayback Machine
  4. В этом примере: переменные «window» и «button» (указывающие на Python-представление GTK-объектов) были сохранены до самого выхода из программы

Литература

  • Karvinen, K.; Karvinen, T. Make: Arduino Bots and Gadgets: Six Embedded Projects with Open Source Hardware and Software. — O'Reilly Media, Incorporated, 2011. — 278 p. — ISBN 9781449389710.

Ссылки