tkinter --- Tcl/Tk 的 Python 介面¶
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 相關資源:
書籍:
- Modern Tkinter for Busy Python Developers
由 Mark Roseman 所著。(ISBN 978-1999149567)
- Python GUI programming with Tkinter
由 Alan D. Moore 所著。(ISBN 978-1788835886)
- Programming Python
由 Mark Lutz 所著;對 Tkinter 有極佳的涵蓋。(ISBN 978-0596158101)
- Tcl and the Tk Toolkit (2nd edition)
由 Tcl/Tk 發明者 John Ousterhout 與 Ken Jones 所著;不包含 Tkinter。(ISBN 978-0321336330)
架構¶
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 選項值相同的方式指定(也就是說,其形式類似