圖形使用者介面常見問答集
************************


圖形使用者介面 (GUI) 的常見問題
===============================


Python 有哪些 GUI 套件？
========================

Python 的標準版本會包含一個 Tcl/Tk 小工具集 (widget set) 的物件導向介
面，稱為 tkinter。這可能是最容易安裝（因為它已包含在 Python 的大多數二
進制發行版本中）和使用的。有關 Tk 的詳細資訊（包含指向原始碼的指標），
請參閱 Tcl/Tk 首頁。Tcl/Tk 在 macOS、Windows 和 Unix 平台上是完全可攜
(portable) 的。

根據你要使用的平台，還有其他幾種選擇。在 python wiki 上可以找到一份跨
平台的以及各平台專屬的 GUI 框架清單。


Tkinter 的問答
==============


如何凍結 Tkinter 應用程式？
---------------------------

凍結 (freeze) 是一個能建立獨立應用程式的工具。在凍結 Tkinter 應用程式
時，該應用程式不是真正的獨立，因為該應用程式仍然需要 Tcl 和 Tk 函式庫
。

將應用程式與 Tcl 和 Tk 函式庫一併發送是一種解決方法，並在運行時使用
"TCL_LIBRARY" 和 "TK_LIBRARY" 環境變數來指向該函式庫。

要得到真正獨立的應用程式，必須將構成函式庫的 Tcl 腳本也整合到應用程式
中。一個可支援該方法的工具是 SAM（stand-alone modules，獨立模組），它
是 Tix 發行版的一部分 (https://tix.sourceforge.net/)。

請在 SAM 被啟用的情況下建置 Tix，對 Python 的 "Modules/tkappinit.c" 中
的 "Tclsam_init()" 等函式執行適當的呼叫，並與 libtclsam 和 libtksam 連
結（你可能也會 include Tix 函式庫）。


是否可以在等待 I/O 時處理 Tk 事件？
-----------------------------------

在 Windows 以外的平台上是可以的，你甚至不需要執行緒！但是，你必須稍微
調整你的 I/O 程式碼。Tk 具有等效於 Xt 的 "XtAddInput()" 的函式呼叫，它
能讓你記錄一個回呼 (callback) 函式，當 I/O 在一個檔案描述符 (file
descriptor) 上可進行時，該函式將會從 Tk mainloop 被呼叫。請參閱文件处
理程序。


我無法讓鍵繫結 (key binding) 在 Tkinter 中作用：為什麼？
--------------------------------------------------------

一個經常聽到的抱怨是，儘管事件處理程式 (event handler) 已經繫結到帶有
"bind()" method 的事件，但在按下相應的鍵時，該事件也沒有被處理。

最常見的原因是，繫結到的小工具並沒有「鍵盤焦點 (keyboard focus)」。請
查看 Tk 說明文件中關於焦點命令的敘述。通常，點擊一個小工具，會讓它得到
鍵盤焦點（但不適用於標籤；請參閱 takefocus 選項）。
