Содержание страницы
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
Общие вопросы по GUI¶General 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.
Какие платформозависимые наборы инструментов 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).