tkinter --- Tcl/Tk 的 Python 介面

原始碼:Lib/tkinter/__init__.py


tkinter 套件(「Tk 介面」)是 Tcl/Tk GUI 工具集的標準 Python 介面。Tk 和 tkinter 在大多數 Unix 平台(包含 macOS)以及 Windows 系統上都可以使用。

從命令列執行 python -m tkinter 應該會開啟一個展示簡單 Tk 介面的視窗,讓你知道 tkinter 已正確安裝在你的系統上,並且也會顯示已安裝的 Tcl/Tk 版本,這樣你就可以閱讀該版本專屬的 Tcl/Tk 文件。

Tkinter 支援一系列的 Tcl/Tk 版本,這些版本可以是有或沒有執行緒支援的建構版本。官方的 Python 二進位發行版捆綁了有執行緒支援的 Tcl/Tk 8.6。關於支援版本的更多資訊,請參閱 _tkinter 模組的原始碼。

Tkinter 並非一個輕薄的包裝器,而是加入了相當多自身的邏輯,使其體驗更具 Python 風格(pythonic)。本文件將著重於這些新增和變更,對於未變更的細節,則會引導讀者參閱官方的 Tcl/Tk 文件。

備註

Tcl/Tk 8.5(2007)引入了一套現代化的主題式使用者介面元件,以及一個用以操作它們的新 API。新舊 API 目前都還能使用。你在網路上找到的大多數文件仍使用舊版 API,而且可能已經嚴重過時。

這是一個可選模組。如果你的 CPython 副本中缺少它,請查閱你的發行者(即提供 Python 給你的人)的文件。如果你就是發行者,請參閱 可選模組的需求

也參考

  • TkDocs

    關於使用 Tkinter 建立使用者介面的詳盡教學。內容解釋了關鍵概念,並使用現代 API 來說明建議的方法。

  • Tkinter 8.5 reference: a GUI for Python

    Tkinter 8.5 的參考文件,詳細說明了可用的類別、方法和選項。

Tcl/Tk 相關資源:

  • Tk 指令

    Tkinter 所使用的每個底層 Tcl/Tk 指令的綜合參考資料。

  • Tcl/Tk 首頁

    額外的文件,以及連至 Tcl/Tk 核心開發的連結。

書籍:

架構

Tcl/Tk 並非單一函式庫,而是由幾個不同的模組所組成,每個模組都有獨立的功能和官方文件。Python 的二進位發行版也隨附了一個附加模組。

Tcl

Tcl 是一個動態直譯的程式語言,就像 Python 一樣。雖然它可以作為通用程式語言獨立使用,但它最常被嵌入到 C 應用程式中,作為腳本引擎或 Tk 工具集的介面。Tcl 函式庫有一個 C 介面,可用於建立和管理一個或多個 Tcl 直譯器的實例,在這些實例中執行 Tcl 指令和腳本,並新增以 Tcl 或 C 實作的自訂指令。每個直譯器都有一個事件佇列,並有設施可以向其傳送事件並加以處理。與 Python 不同,Tcl 的執行模型是圍繞著協同多工(cooperative multitasking)設計的,而 Tkinter 則彌合了這種差異(詳情請參閱 Threading model)。

Tk

Tk 是一個以 C 實作的 Tcl 套件,它新增了自訂指令來建立和操作 GUI 元件。每個 Tk 物件都嵌入了自己載入 Tk 的 Tcl 直譯器實例。Tk 的元件非常可自訂,但代價是外觀較為過時。Tk 使用 Tcl 的事件佇列來產生和處理 GUI 事件。

Ttk

主題式 Tk(Ttk)是較新的一族 Tk 元件,相較於許多傳統的 Tk 元件,它在不同平台上提供了更好的外觀。從 Tk 8.5 版開始,Ttk 作為 Tk 的一部分發行。Python 的繫結(bindings)則在一個獨立的模組 tkinter.ttk 中提供。

在內部,Tk 和 Ttk 使用底層作業系統的設施,即 Unix/X11 上的 Xlib、macOS 上的 Cocoa、Windows 上的 GDI。

當你的 Python 應用程式使用 Tkinter 中的類別(例如,建立一個元件)時,tkinter 模組會先組合一個 Tcl/Tk 指令字串。它將該 Tcl 指令字串傳遞給一個內部的 _tkinter 二進位模組,後者再呼叫 Tcl 直譯器來對其進行計算。Tcl 直譯器接著會呼叫 Tk 和/或 Ttk 套件,而這些套件又會再呼叫 Xlib、Cocoa 或 GDI。

Tkinter 模組

對 Tkinter 的支援分散在數個模組中。大多數應用程式將需要主要的 tkinter 模組,以及 tkinter.ttk 模組,後者提供了現代主題式元件集和 API:

from tkinter import *
from tkinter import ttk
class tkinter.Tk(screenName=None, baseName=None, className='Tk', useTk=True, sync=False, use=None)

建構一個頂層 Tk 元件,它通常是應用程式的主視窗,並為此元件初始化一個 Tcl 直譯器。每個實例都有其自己關聯的 Tcl 直譯器。

Tk 類別通常使用所有預設值來實例化。然而,目前可辨識下列關鍵字引數:

screenName

當給定(作為字串)時,設定 DISPLAY 環境變數。(僅限 X11)

baseName

設定檔的名稱。預設情況下,baseName 是從程式名稱(sys.argv[0])衍生而來。

className

元件類別的名稱。用作設定檔,也用作呼叫 Tcl 時的名稱(interp 中的 argv0)。

useTk

若為 True,則初始化 Tk 子系統。tkinter.Tcl() 函式會將此設定為 False

sync

若為 True,則同步執行所有 X 伺服器指令,以便立即回報錯誤。可用於偵錯。(僅限 X11)

use

指定要嵌入應用程式的視窗 id,而不是將其建立為獨立的頂層視窗。id 必須以與頂層元件的 -use 選項值相同的方式指定(也就是說,其形式類似 winfo_id() 回傳的形式)。

請注意,在某些平台上,只有當 id 指向一個已啟用 -container 選項的 Tk 框架或頂層視窗時,此功能才能正常運作。

Tk 會讀取名為 .className.tcl.baseName.tcl 的設定檔,並在 Tcl 直譯器中進行直譯,並對 .className.py.baseName.py 的內容呼叫 exec()。設定檔的路徑是 HOME 環境變數,如果未定義,則是 os.curdir

tk

透過實例化 Tk 建立的 Tk 應用程式物件。這提供了對 Tcl 直譯器的存取。每個附加到同一個 Tk 實例的元件,其 tk 屬性都具有相同的值。

master

包含此元件的元件物件。對於 TkmasterNone,因為它是主視窗。masterparent 這兩個術語很相似,有時會作為引數名稱互換使用;然而,呼叫 winfo_parent() 會回傳元件名稱的字串,而 master 則回傳物件。parent/child 反映了樹狀關係,而 master (或 container)/content 反映了容器結構。

children

此元件的直接子代,形式為一個 dict,其中鍵為子元件的名稱,值為子實例物件。

tkinter.Tcl(screenName=None, baseName=None, className='Tk', useTk=False)

Tcl() 函式是一個工廠函式,它建立的物件與 Tk 類別建立的物件非常相似,只是它不會初始化 Tk 子系統。這在驅動 Tcl 直譯器時最為有用,尤其是在不希望建立額外頂層視窗的環境中,或者在無法建立的環境中(例如沒有 X 伺服器的 Unix/Linux 系統)。由 Tcl() 物件建立的物件可以透過呼叫其 loadtk() 方法來建立一個頂層視窗(並初始化 Tk 子系統)。

提供 Tk 支援的模組包括:

tkinter

主要的 Tkinter 模組。

tkinter.colorchooser

讓使用者選擇顏色的對話方塊。

tkinter.commondialog

此處列出的其他模組中定義的對話方塊的基底類別。

tkinter.filedialog

讓使用者指定要開啟或儲存的檔案的通用對話方塊。

tkinter.font

協助處理字型的工具程式。

tkinter.messagebox

存取標準的 Tk 對話方塊。

tkinter.scrolledtext

內建垂直捲軸的文字元件。

tkinter.simpledialog