# 图形用户界面（GUI）常见问题

目录

- 图形用户界面（GUI）常见问题

  - 图形界面常见问题

  - Python 有哪些 GUI 工具包？

  - 有关Tkinter的问题

    - 我怎样“冻结”Tkinter程序？

    - 在等待 I/O 操作时能够处理 Tk 事件吗？

    - 在Tkinter中键绑定不工作：为什么？

## 图形界面常见问题

## Python 有哪些 GUI 工具包？

Standard builds of Python include an object-oriented interface to the Tcl/Tk widget set, called tkinter. This is probably the easiest to install (since it comes included with most binary distributions of Python) and use. For more info about Tk, including pointers to the source, see the Tcl/Tk home page. Tcl/Tk is fully portable to the macOS, Windows, and Unix platforms.

存在多种选项，具体取决于你的目标平台。 Python Wiki 上提供了一个 跨平台 和 平台专属 的 GUI 框架列表。

## 有关Tkinter的问题

### 我怎样“冻结”Tkinter程序？

Freeze是一个用来创建独立应用程序的工具。 当冻结(freeze) Tkinter程序时，程序并不是真的能够独立运行，因为程序仍然需要Tcl和Tk库。

一种解决方法是将程序与 Tcl 和 Tk 库一同发布，并且在运行时使用环境变量 `TCL_LIBRARY` 和 `TK_LIBRARY` 指向他们的位置。

为了获得真正能独立运行的应用程序，来自库里的 Tcl 脚本也需要被整合进应用程序。 一个做这种事情的工具叫 SAM (stand-alone modules，独立模块) ，它是 Tix distribution (http://tix.sourceforge.net/) 的一部分。

在启用 SAM 时编译 Tix ，在 Python 文件 `Modules/tkappinit.c` 中执行对 `Tclsam_init()` 等的适当调用，并且将程序与 libtclsam 和 libtksam 相链接（可能也要包括 Tix 的库）。

### 在等待 I/O 操作时能够处理 Tk 事件吗？

在 Windows 以外的其他平台上可以，你甚至不需要使用线程！ 但是你必须稍微修改一下你的 I/O 代码。 Tk 有与 Xt 的 `XtAddInput()` 对应的调用，它允许你注册一个回调函数，当一个文件描述符可以进行 I/O 操作的时候，Tk 主循环将会调用这个回调函数。 参见 文件句柄。

### 在Tkinter中键绑定不工作：为什么？

经常听到的抱怨是：已经通过 `bind()` 方法绑定了事件的处理程序，但是，当按下相关的按键后，这个处理程序却没有执行。

最常见的原因是，那个绑定的控件没有“键盘焦点”。请在 Tk 文档中查找 focus 指令。通常一个控件要获得“键盘焦点”，需要点击那个控件（而不是标签；请查看 takefocus 选项）。