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

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

Общие вопросы по GUIGeneral GUI Questions

Какие кроссплатформенные инструментарии 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.

wxWidgets

wxWidgets – это библиотека классов GUI, написанная на C++, которая является переносимым интерфейсом к различным платформозависимым библиотекам и имеет интерфейс Python под названием wxPython.

wxWidgets сохраняет внешний вид и поведение базового графического инструментария и имеет большой набор виджетов и коллекцию классов GDI. Подробнее см. на странице wxWidgets.

wxWidgets поддерживает Windows и MacOS; на Unix-подобных системах он поддерживает как GTk+, так и Motif.

Qt

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

Gtk+

Привязки PyGtk к набору инструментов Gtk+ были реализованы Джеймсом Хенстриджем; см. <http://www.pygtk.org>.

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 в MacOS X.

Установив мост PyObjc для Objective-C, программы на Python могут использовать библиотеки Cocoa в MacOS X. См. документацию, поставляемую с портом для Mac.

Pythonwin от Mark Hammond включает интерфейс к Microsoft Foundation Classes и среду программирования на Python, которая в основном написана на Python с использованием классов MFC.

Вопросы по TkinterTkinter questions

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

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

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

Чтобы получить по-настоящему автономные приложения, сценарии Tcl, составляющие библиотеку, также должны быть интегрированы в приложение. Одним из инструментов, поддерживающих это, является SAM (автономные модули), который входит в состав дистрибутива Tix (http://tix.sourceforge.net/).

Соберите Tix с включённым SAM, выполните соответствующий вызов Tclsam_init() и т.д. внутри Modules/tkappinit.c Python и слинкуйте с libtclsam и libtksam (возможно, также стоит включить библиотеки Tix).

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

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

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).