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