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

Общие вопросы по графическому интерфейсу пользователя

Какие наборы инструментов GUI существуют для Python?

Стандартные сборки Python включают объектно-ориентированный интерфейс к набору виджетов Tcl/Tk, называемый tkinter. Это, вероятно, самый простой в установке (поскольку он входит в состав большинства binary distributions Python) и использовании. Более подробную информацию о Tk, включая указатели на исходный текст, смотрите в Tcl/Tk home page. Tcl/Tk полностью переносится на платформы macOS, Windows и Unix.

В зависимости от того, на какую платформу (платформы) вы нацелены, существует также несколько альтернатив. Фреймворки графического интерфейса list of cross-platform и platform-specific можно найти на вики python.

Вопросы по Tkinter

Как заморозить приложения Tkinter?

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

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

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

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

Можно ли обрабатывать события Tk в ожидании ввода/вывода?

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

Я не могу заставить привязки клавиш работать в Tkinter: почему?

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

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

Вернуться на верх