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

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

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

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

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

Вопросы по Tkinter

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

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

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

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

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

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

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

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

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

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

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