Документация Python неофициальный перевод
Содержание страницы

FAQ по графическому интерфейсу пользователяGraphic User Interface FAQ

Какие кроссплатформенные инструментарии GUI существуют для Python?What platform-independent GUI toolkits exist for Python?

В зависимости от целевой платформы (платформ) существует несколько.

Tkinter

Стандартные сборки Python включают объектно-ориентированный интерфейс к набору виджетов Tcl/Tk, называемый Tkinter. Это, вероятно, самый простой в установке и использовании. Для получения дополнительной информации о Tk, включая ссылки на исходный код, посетите домашнюю страницу Tcl/Tk по адресу http://www.tcl.tk. Tcl/Tk полностью переносим на платформы MacOS, Windows и Unix.

wxWindows

wxWidgets (http://www.wxwidgets.org) – это свободная переносимая библиотека классов GUI, написанная на C++, которая обеспечивает нативный внешний вид на многих платформах, включая Windows, MacOS X, GTK, X11 – все они указаны как текущие стабильные цели. Существуют привязки для многих языков, включая Python, Perl, Ruby и т. д.

wxPython (http://www.wxpython.org) – это привязка для wxWidgets на Python. Хотя wxPython часто немного отстаёт от официальных выпусков wxWidgets, он также предоставляет ряд возможностей через расширения на чистом Python, недоступные в других языковых привязках. Существует активное сообщество пользователей и разработчиков wxPython.

И wxWidgets, и wxPython являются бесплатным программным обеспечением с открытым исходным кодом и разрешительными лицензиями, которые допускают их использование как в коммерческих продуктах, так и в бесплатном или условно-бесплатном ПО.

Qt

Существуют привязки для инструментария Qt (PyQt) и для KDE (PyKDE). Если вы пишете открытое программное обеспечение, вам не нужно платить за PyQt, но если вы хотите писать проприетарные приложения, вы должны купить лицензию на PyQt у Riverbank Computing и (до Qt 4.4; Qt 4.5 и выше лицензируется по LGPL) лицензию на Qt у Trolltech.

Gtk+

Привязки PyGtk для инструментария Gtk+ были реализованы Джеймсом Хенстриджем; смотрите ftp://ftp.gtk.org/pub/gtk/python/.

FLTK

Привязки Python для набора инструментов FLTK, простой, но мощной и зрелой кроссплатформенной оконной системы, доступны в проекте PyFLTK.

FOX

Доступна обёртка для FOX toolkit под названием FXpy. FOX поддерживает как Unix-подобные системы, так и Windows.

OpenGL

Для привязок OpenGL см. PyOpenGL.

Какие платформозависимые наборы инструментов GUI существуют для Python?What platform-specific GUI toolkits exist for Python?

Порт для Mac от Джека Янсена имеет богатый и постоянно растущий набор модулей, поддерживающих вызовы собственных инструментов Mac. Порт включает поддержку библиотек Carbon для MacOS9 и MacOS X. Установив PyObjc Objective-C bridge, программы на Python могут использовать библиотеки Cocoa для MacOS X. Смотрите документацию, прилагаемую к порту для Mac.

Pythonwin от Марка Хэммонда включает интерфейс к библиотеке Microsoft Foundation Classes и среду программирования на Python, использующую этот интерфейс, которая в основном написана на Python.

Вопросы по TkinterTkinter questions

Как заморозить приложения Tkinter?How do I freeze Tkinter applications?

Freeze – это инструмент для создания автономных приложений. При заморозке приложений Tkinter приложения не будут полностью автономными, поскольку приложению всё равно потребуются библиотеки Tcl и Tk.

Одно из решений – поставлять приложение с библиотеками tcl и tk и указывать на них во время выполнения с помощью TCL_LIBRARY и TK_LIBRARY переменных окружения.

Чтобы получить действительно автономные приложения, сценарии Tcl, составляющие библиотеку, должны быть интегрированы в приложение. Один из инструментов, поддерживающий это – SAM (автономные модули), который является частью дистрибутива Tix (http://tix.mne.com). Соберите Tix с включённым SAM, выполните соответствующий вызов Tclsam_init и т.д. внутри Python’s Modules/tkappinit.c и свяжите с libtclsam и libtksam (вы также можете включить библиотеки Tix).

Можно ли обрабатывать события Tk во время ожидания ввода-вывода?Can I have Tk events handled while waiting for I/O?

Да, и вам даже не нужны потоки! Но вам придётся перестроить ваш I/O код немного. Tk имеет эквивалент вызова Xt’s XtAddInput(), который позволяет зарегистрировать функцию обратного вызова, которая будет вызвана из главного цикла Tk, когда I/O возможен на файловом дескрипторе. Вот что вам нужно:

from Tkinter import tkinter
tkinter.createfilehandler(file, mask, callback)

Файл может быть файловым объектом Python или объектом сокета (фактически, любым объектом, имеющим метод fileno()), либо целочисленным файловым дескриптором. Маска – одна из констант tkinter.READABLE или tkinter.WRITABLE. Функция обратного вызова вызывается следующим образом:

callback(file, mask)

По завершении необходимо отменить регистрацию обратного вызова, используя

tkinter.deletefilehandler(file)

Примечание: поскольку неизвестно, сколько байт доступно для чтения, нельзя использовать методы read или readline файлового объекта Python, так как они будут настаивать на чтении предопределённого количества байтов. Для сокетов прекрасно подойдут методы recv() или recvfrom(); для других файлов используйте os.read(file.fileno(), maxbytecount).

Не удаётся заставить работать привязки клавиш в Tkinter: почему?I can’t get key bindings to work in Tkinter: why?

Нередко жалуются, что обработчики событий, назначенные через метод bind(), не срабатывают, даже если нужная клавиша нажата.

Наиболее распространённая причина в том, что виджет, к которому относится привязка, не имеет «фокуса клавиатуры». Обратитесь к документации Tk по команде focus. Обычно виджет получает фокус клавиатуры при щелчке по нему (но не для меток; см. опцию takefocus).