Содержание страницы
FAQ по графическому интерфейсу пользователя¶Graphic User Interface FAQ
Содержание
- Часто задаваемые вопросы о графическом интерфейсе пользователя
- Общие вопросы по GUI
- Какие существуют кроссплатформенные GUI-инструментарии для Python?
- Какие существуют платформозависимые GUI-инструментарии для Python?What platform-specific GUI toolkits exist for Python?
- Вопросы по Tkinter
- Как заморозить приложения Tkinter?
- Можно ли обрабатывать события Tk во время ожидания ввода-вывода?Can I have Tk events handled while waiting for I/O?
- Не удаётся заставить работать привязки клавиш в Tkinter: почему?I can’t get key bindings to work in Tkinter: why?
Общие вопросы по GUI¶General GUI Questions
Какие кроссплатформенные инструментарии GUI существуют для Python?¶What platform-independent GUI toolkits exist for Python?
В зависимости от целевой платформы существует несколько вариантов. Некоторые из них ещё не портированы на Python 3. По крайней мере Tkinter и Qt известны своей совместимостью с Python 3.
Tkinter¶
В стандартные сборки Python включён объектно-ориентированный интерфейс к набору виджетов Tcl/Tk, называемый tkinter. Вероятно, это самый простой в установке (поскольку он входит в состав большинства бинарных дистрибутивов Python) и использовании. Для получения дополнительной информации о Tk, включая ссылки на исходный код, см. домашнюю страницу Tcl/Tk. Tcl/Tk полностью переносим на платформы MacOS, Windows и Unix.
wxWidgets¶
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 или PySide) и для KDE (PyKDE). PyQt в настоящее время более зрелый, чем PySide, однако для написания проприетарных приложений необходимо приобрести лицензию PyQt у Riverbank Computing. PySide бесплатен для всех приложений.
Qt версии 4.5 и выше распространяется по лицензии LGPL; также коммерческие лицензии доступны от Nokia.
Gtk+¶
Привязки GObject introspection для Python позволяют писать приложения GTK+ 3. Также существует учебник по Python GTK+ 3.
Более старые привязки PyGtk для набора инструментов Gtk+ 2 были реализованы Джеймсом Хенстриджем; см. <http://www.pygtk.org>.
FLTK¶
Привязки Python для набора инструментов FLTK, простой, но мощной и зрелой кроссплатформенной оконной системы, доступны в проекте PyFLTK.
FOX¶
Доступна обёртка для FOX toolkit под названием FXpy. FOX поддерживает как Unix-подобные системы, так и Windows.
Какие платформозависимые наборы инструментов 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.
Вопросы по Tkinter¶Tkinter 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).