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 不是一個簡單的包裝器,而是添加了相當多的自身邏輯,使體驗更加 Pythonic。本文件將重點介紹這些新增和更改,並參考官方 Tcl/Tk 文件以瞭解未更改的詳細資訊。
注意
Tcl/Tk 8.5 (2007) 引入了一組現代的主題使用者介面元件以及用於使用它們的新 API。舊的和新的 API 仍然可用。您在網上找到的大多數文件仍然使用舊的 API,並且可能已經過時。
另請參閱
- TkDocs
關於使用 Tkinter 建立使用者介面的廣泛教程。解釋了關鍵概念,並使用現代 API 說明了推薦的方法。
- Tkinter 8.5 參考:用於 Python 的 GUI
Tkinter 8.5 的參考文件,詳細說明了可用的類、方法和選項。
Tcl/Tk 資源
書籍
- 面向忙碌的 Python 開發人員的現代 Tkinter
作者:Mark Roseman。(ISBN 978-1999149567)
- 使用 Tkinter 進行 Python GUI 程式設計
作者:Alan D. Moore。(ISBN 978-1788835886)
- Python 程式設計
作者:Mark Lutz;對 Tkinter 進行了出色的介紹。(ISBN 978-0596158101)
- Tcl 和 Tk 工具包(第二版)
作者:Tcl/Tk 的發明者 John Ousterhout 和 Ken Jones;不包括 Tkinter。(ISBN 978-0321336330)
架構¶
Tcl/Tk 不是一個單獨的庫,而是由幾個不同的模組組成,每個模組都有單獨的功能及其自己的官方文件。Python 的二進位制發行版還附帶一個附加模組。
- Tcl
Tcl 是一種動態解釋型程式語言,就像 Python 一樣。雖然它可以作為通用程式語言單獨使用,但它最常作為指令碼引擎或 Tk 工具包的介面嵌入到 C 應用程式中。Tcl 庫具有 C 介面,用於建立和管理一個或多個 Tcl 直譯器例項,在這些例項中執行 Tcl 命令和指令碼,並新增以 Tcl 或 C 實現的自定義命令。每個直譯器都有一個事件佇列,並且有工具可以向其傳送事件並處理它們。與 Python 不同,Tcl 的執行模型圍繞協作式多工處理而設計,而 Tkinter 彌合了這種差異(有關詳細資訊,請參閱 執行緒模型)。
- Tk
Tk 是一個以 C 實現的 Tcl 包,它添加了自定義命令來建立和操作 GUI 小部件。每個
Tk
物件都嵌入了自己的 Tcl 直譯器例項,並在其中載入了 Tk。Tk 的小部件非常可自定義,但代價是外觀過時。Tk 使用 Tcl 的事件佇列來生成和處理 GUI 事件。- Ttk
主題 Tk (Ttk) 是較新的 Tk 小部件系列,與許多經典 Tk 小部件相比,它在不同平臺上提供了更好的外觀。Ttk 作為 Tk 的一部分分發,從 Tk 版本 8.5 開始。Python 繫結在單獨的模組
tkinter.ttk
中提供。
在內部,Tk 和 Ttk 使用底層作業系統的工具,即 Unix/X11 上的 Xlib、macOS 上的 Cocoa、Windows 上的 GDI。
當您的 Python 應用程式使用 Tkinter 中的類(例如,建立小部件)時,tkinter
模組首先組裝一個 Tcl/Tk 命令字串。它將 Tcl 命令字串傳遞給內部的 _tkinter
二進位制模組,然後該模組呼叫 Tcl 直譯器對其進行求值。然後,Tcl 直譯器將呼叫 Tk 和/或 Ttk 包,而 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
。
- tkinter.Tcl(screenName=None, baseName=None, className='Tk', useTk=False)¶
Tcl()
函式是一個工廠函式,它建立的物件與Tk
類建立的物件非常相似,只是它不初始化 Tk 子系統。這在以下情況下最有用:在不需要建立額外頂層視窗的環境中驅動 Tcl 直譯器,或者在無法建立頂層視窗的環境中(例如沒有 X 伺服器的 Unix/Linux 系統)。 透過呼叫其loadtk()
方法,Tcl()
物件建立的物件可以建立一個頂層視窗(並初始化 Tk 子系統)。
提供 Tk 支援的模組包括
tkinter
主 Tkinter 模組。
tkinter.colorchooser
用於讓使用者選擇顏色的對話方塊。
tkinter.commondialog
此處列出的其他模組中定義的對話方塊的基類。
tkinter.filedialog
用於讓使用者指定要開啟或儲存的檔案的常用對話方塊。
tkinter.font
幫助處理字型的實用工具。
tkinter.messagebox
訪問標準 Tk 對話方塊。
tkinter.scrolledtext
內建垂直捲軸的文字小部件。
tkinter.simpledialog
基本對話方塊和便捷函式。
tkinter.ttk
Tk 8.5 中引入的主題小部件集,為
tkinter
主模組中的許多經典小部件提供了現代替代方案。
其他模組
_tkinter
包含 Tcl/Tk 底層介面的二進位制模組。它由
tkinter
主模組自動匯入,應用程式設計師永遠不應直接使用它。它通常是一個共享庫(或 DLL),但在某些情況下可能會與 Python 直譯器靜態連結。idlelib
Python 的整合開發和學習環境 (IDLE)。基於
tkinter
。tkinter.constants
在將各種引數傳遞給 Tkinter 呼叫時,可以用來代替字串的符號常量。由
tkinter
主模組自動匯入。tkinter.dnd
(實驗性)為
tkinter
提供拖放支援。當它被 Tk DND 替換時,將被棄用。turtle
Tk 視窗中的 Turtle 圖形。
Tkinter 救生指南¶
本節並非旨在對 Tk 或 Tkinter 進行詳盡的教程。為此,請參閱前面提到的外部資源之一。相反,本節提供了一個關於 Tkinter 應用程式外觀的快速入門,確定了基本的 Tk 概念,並解釋了 Tkinter 包裝器的結構。
本節的其餘部分將幫助您識別 Tkinter 應用程式中需要的類、方法和選項,以及在哪裡找到關於它們的更詳細文件,包括在官方 Tcl/Tk 參考手冊中。
一個 Hello World 程式¶
我們將從在 Tkinter 中逐步完成一個“Hello World”應用程式開始。這不是我們能編寫的最小的一個,但它足以說明您需要了解的一些關鍵概念。
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
匯入後,下一行建立 Tk
類的例項,該例項初始化 Tk 並建立其關聯的 Tcl 直譯器。它還建立一個頂層視窗,稱為根視窗,它充當應用程式的主視窗。
下一行建立一個框架小部件,在本例中,它將包含一個標籤和一個我們將接下來建立的按鈕。該框架適合在根視窗內。
下一行建立一個標籤小部件,其中包含靜態文字字串。grid()
方法用於指定標籤在其包含框架小部件內的相對佈局(位置),類似於 HTML 中表格的工作方式。
然後建立一個按鈕小部件,並將其放置在標籤的右側。按下時,它將呼叫根視窗的 destroy()
方法。
最後,mainloop()
方法將所有內容放在顯示屏上,並響應使用者輸入,直到程式終止。
重要的 Tk 概念¶
即使是這個簡單的程式也說明了以下關鍵 Tk 概念
- 小部件
Tkinter 使用者介面由各個小部件組成。每個小部件都表示為一個 Python 物件,從諸如
ttk.Frame
、ttk.Label
和ttk.Button
等類例項化。- 小部件層次結構
小部件以層次結構排列。標籤和按鈕包含在框架內,而框架又包含在根視窗內。在建立每個子小部件時,其父小部件作為第一個引數傳遞給小部件建構函式。
- 配置選項
小部件具有配置選項,可修改其外觀和行為,例如在標籤或按鈕中顯示的文字。不同的小部件類將具有不同的選項集。
- 幾何管理
小部件在建立時不會自動新增到使用者介面中。像
grid
這樣的幾何管理器控制它們在使用者介面中的放置位置。- 事件迴圈
Tkinter 僅在主動執行事件迴圈時才會對使用者輸入、程式中的更改甚至重新整理顯示做出反應。如果您的程式沒有執行事件迴圈,則使用者介面將不會更新。
瞭解 Tkinter 如何包裝 Tcl/Tk¶
當您的應用程式使用 Tkinter 的類和方法時,Tkinter 內部正在組裝表示 Tcl/Tk 命令的字串,並在附加到應用程式 Tk
例項的 Tcl 直譯器中執行這些命令。
無論是嘗試瀏覽參考文件、嘗試查詢正確的方法或選項、改編一些現有程式碼還是除錯您的 Tkinter 應用程式,有時瞭解這些底層 Tcl/Tk 命令的樣子會很有用。
為了說明,下面是上述 Tkinter 指令碼主要部分的 Tcl/Tk 等效項。
ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
Tcl 的語法類似於許多 shell 語言,其中第一個單詞是要執行的命令,後面跟著該命令的引數,並用空格分隔。 在不涉及太多細節的情況下,請注意以下事項
用於建立小部件的命令(如
ttk::frame
)對應於 Tkinter 中的小部件類。Tcl 部件選項(如
-text
)對應於 Tkinter 中的關鍵字引數。在 Tcl 中,部件透過路徑名引用(如
.frm.btn
),而 Tkinter 不使用名稱,而是使用物件引用。部件在部件層次結構中的位置編碼在其(分層)路徑名中,該路徑名使用
.
(點)作為路徑分隔符。根視窗的路徑名只是.
(點)。在 Tkinter 中,層次結構不是透過路徑名定義的,而是在建立每個子部件時指定父部件來定義的。在 Tcl 中作為單獨命令實現的運算(如
grid
或destroy
)在 Tkinter 部件物件上表示為方法。您很快就會看到,在其他時候,Tcl 使用的似乎是部件物件上的方法呼叫,這更接近於 Tkinter 中使用的內容。
我該如何……?什麼選項會……?¶
如果您不確定如何在 Tkinter 中執行某項操作,並且您無法在使用的教程或參考文件中立即找到它,那麼有一些策略可能會有所幫助。
首先,請記住,各個部件的工作方式的詳細資訊可能會因 Tkinter 和 Tcl/Tk 的不同版本而異。如果您正在搜尋文件,請確保它與系統上安裝的 Python 和 Tcl/Tk 版本相對應。
在搜尋如何使用 API 時,瞭解您正在使用的類、選項或方法的準確名稱很有幫助。內省,無論是在互動式 Python shell 中還是使用 print()
,都可以幫助您識別所需的內容。
要了解任何部件上可用的配置選項,請呼叫其 configure()
方法,該方法返回一個字典,其中包含有關每個物件的各種資訊,包括其預設值和當前值。使用 keys()
僅獲取每個選項的名稱。
btn = ttk.Button(frm, ...)
print(btn.configure().keys())
由於大多數部件都有許多共同的配置選項,因此找出特定於特定部件類的選項可能很有用。將選項列表與更簡單的部件(如框架)的選項列表進行比較是一種方法。
print(set(btn.configure().keys()) - set(frm.configure().keys()))
同樣,您可以使用標準 dir()
函式找到部件物件的可用方法。如果您嘗試一下,您會看到有 200 多個常用部件方法,因此再次識別特定於部件類的方法是有幫助的。
print(dir(btn))
print(set(dir(btn)) - set(dir(frm)))
執行緒模型¶
Python 和 Tcl/Tk 具有非常不同的執行緒模型,tkinter
試圖彌合這些模型之間的差距。如果您使用執行緒,您可能需要注意這一點。
一個 Python 直譯器可能關聯有多個執行緒。在 Tcl 中,可以建立多個執行緒,但每個執行緒都有一個單獨的 Tcl 直譯器例項與之關聯。執行緒還可以建立多個直譯器例項,儘管每個直譯器例項只能由建立它的一個執行緒使用。
tkinter
建立的每個 Tk
物件都包含一個 Tcl 直譯器。它還會跟蹤哪個執行緒建立了該直譯器。可以從任何 Python 執行緒呼叫 tkinter
。在內部,如果呼叫來自建立 Tk
物件的執行緒之外的執行緒,則會將一個事件釋出到直譯器的事件佇列,並且在執行時,結果將返回給呼叫 Python 執行緒。
Tcl/Tk 應用程式通常是事件驅動的,這意味著在初始化之後,直譯器會執行一個事件迴圈(即 Tk.mainloop()
)並響應事件。由於它是單執行緒的,因此事件處理程式必須快速響應,否則它們將阻止處理其他事件。為了避免這種情況,任何長時間執行的計算都不應在事件處理程式中執行,而是使用計時器分解為更小的部分,或者在另一個執行緒中執行。這與許多 GUI 工具包不同,在這些工具包中,GUI 在一個與所有應用程式程式碼(包括事件處理程式)完全不同的執行緒中執行。
如果 Tcl 直譯器沒有執行事件迴圈和處理事件,則從執行 Tcl 直譯器的執行緒之外的執行緒進行的任何 tkinter
呼叫都將失敗。
存在一些特殊情況
可以構建 Tcl/Tk 庫,使其不感知執行緒。在這種情況下,
tkinter
會從原始 Python 執行緒呼叫庫,即使這與建立 Tcl 直譯器的執行緒不同。全域性鎖可確保一次只發生一個呼叫。雖然
tkinter
允許您建立Tk
物件(及其自己的直譯器)的多個例項,但是屬於同一執行緒的所有直譯器共享一個公共事件佇列,這會很快變得混亂。實際上,一次不要建立多個Tk
例項。否則,最好在單獨的執行緒中建立它們,並確保您正在執行感知執行緒的 Tcl/Tk 構建。阻塞事件處理程式並不是阻止 Tcl 直譯器重新進入事件迴圈的唯一方法。甚至可以執行多個巢狀的事件迴圈或完全放棄事件迴圈。如果您在事件或執行緒方面做任何棘手的事情,請注意這些可能性。
有一些選定的
tkinter
函式目前僅在從建立 Tcl 直譯器的執行緒呼叫時才起作用。
方便參考¶
設定選項¶
選項控制著部件的顏色和邊框寬度等內容。可以透過三種方式設定選項
- 在物件建立時,使用關鍵字引數
fred = Button(self, fg="red", bg="blue")
- 在物件建立後,將選項名稱視為字典索引
fred["fg"] = "red" fred["bg"] = "blue"
- 使用 config() 方法更新物件建立後的多個屬性
fred.config(fg="red", bg="blue")
有關給定選項及其行為的完整說明,請參閱有關部件的 Tk 手冊頁。
請注意,手冊頁列出了每個部件的“標準選項”和“部件特定選項”。前者是許多部件共有的選項列表,後者是特定於該部件的選項。標準選項記錄在 options(3) 手冊頁上。
本文件中不區分標準選項和小部件特定選項。某些選項不適用於某些型別的小部件。給定的小部件是否響應特定選項取決於小部件的類;按鈕具有 command
選項,而標籤沒有。
給定小部件支援的選項列在該小部件的手冊頁中,或者可以透過呼叫不帶引數的 config()
方法在執行時查詢,或者透過呼叫該小部件的 keys()
方法進行查詢。這些呼叫的返回值是一個字典,其鍵是選項名稱的字串(例如,'relief'
),其值是 5 元組。
某些選項,如 bg
是長名稱的常見選項的同義詞(bg
是“background”的縮寫)。將速記選項的名稱傳遞給 config()
方法將返回一個 2 元組,而不是 5 元組。返回的 2 元組將包含同義詞的名稱和“真實”選項(例如 ('bg', 'background')
)。
索引 |
含義 |
示例 |
---|---|---|
0 |
選項名稱 |
|
1 |
用於資料庫查詢的選項名稱 |
|
2 |
用於資料庫查詢的選項類 |
|
3 |
預設值 |
|
4 |
當前值 |
|
示例
>>> print(fred.config())
{'relief': ('relief', 'relief', 'Relief', 'raised', 'groove')}
當然,列印的字典將包含所有可用的選項及其值。這只是一個示例。
打包器¶
打包器是 Tk 的幾何管理機制之一。幾何管理器用於指定小部件在其容器(它們的相互主控)中的相對位置。與更麻煩的放置器(較少使用,我們在此處不介紹)相比,打包器接受定性關係規範(上方、左側、填充等),並計算出精確的放置座標。
任何主控小部件的大小都由內部的“從屬小部件”的大小決定。打包器用於控制從屬小部件在其打包到的主控內部的顯示位置。您可以將小部件打包到框架中,並將框架打包到其他框架中,以實現您想要的佈局。此外,一旦打包,佈局會動態調整以適應配置的增量更改。
請注意,在通過幾何管理器指定其幾何之前,小部件不會出現。一個常見的早期錯誤是遺漏幾何規範,然後當小部件建立但什麼也沒出現時感到驚訝。只有在例如,對其應用了打包器的 pack()
方法之後,小部件才會出現。
可以使用控制小部件在其容器中顯示位置以及主應用程式視窗調整大小時其行為方式的關鍵字-選項/值對呼叫 pack() 方法。以下是一些示例
fred.pack() # defaults to side = "top"
fred.pack(side="left")
fred.pack(expand=1)
打包器選項¶
有關打包器及其可以採用的選項的更詳細資訊,請參閱手冊頁和 John Ousterhout 的書的第 183 頁。
- anchor
錨點型別。表示打包器在每個從屬部件的包裹中放置它的位置。
- expand
布林值,
0
或1
。- fill
合法值:
'x'
、'y'
、'both'
、'none'
。- ipadx 和 ipady
距離 - 表示從屬小部件每側的內部填充。
- padx 和 pady
距離 - 表示從屬小部件每側的外部填充。
- side
合法值是:
'left'
、'right'
、'top'
、'bottom'
。
耦合小部件變數¶
某些小部件(如文字輸入小部件)的當前值設定可以透過使用特殊選項直接連線到應用程式變數。這些選項是 variable
、textvariable
、onvalue
、offvalue
和 value
。此連線是雙向的:如果變數由於任何原因發生更改,則與其連線的小部件將更新以反映新值。
不幸的是,在 tkinter
的當前實現中,不可能透過 variable
或 textvariable
選項將任意 Python 變數傳遞給小部件。唯一可行的變數型別是從 tkinter
中定義的名為 Variable 的類繼承而來的變數。
已經定義了許多有用的 Variable 子類:StringVar
、IntVar
、DoubleVar
和 BooleanVar
。要讀取此類變數的當前值,請呼叫其上的 get()
方法,要更改其值,請呼叫 set()
方法。如果您遵循此協議,小部件將始終跟蹤變數的值,無需您進一步干預。
例如
import tkinter as tk
class App(tk.Frame):
def __init__(self, master):
super().__init__(master)
self.pack()
self.entrythingy = tk.Entry()
self.entrythingy.pack()
# Create the application variable.
self.contents = tk.StringVar()
# Set it to some value.
self.contents.set("this is a variable")
# Tell the entry widget to watch this variable.
self.entrythingy["textvariable"] = self.contents
# Define a callback for when the user hits return.
# It prints the current value of the variable.
self.entrythingy.bind('<Key-Return>',
self.print_contents)
def print_contents(self, event):
print("Hi. The current entry content is:",
self.contents.get())
root = tk.Tk()
myapp = App(root)
myapp.mainloop()
視窗管理器¶
在 Tk 中,有一個實用程式命令 wm
,用於與視窗管理器互動。wm
命令的選項允許您控制諸如標題、放置、圖示點陣圖等內容。在 tkinter
中,這些命令已作為 Wm
類的方法實現。頂級小部件是從 Wm
類繼承的,因此可以直接呼叫 Wm
方法。
要訪問包含給定小部件的頂級視窗,您通常可以直接引用該小部件的主控。當然,如果小部件已被打包在框架內,則主控將不代表頂級視窗。要訪問包含任意小部件的頂級視窗,您可以呼叫 _root()
方法。此方法以一個下劃線開頭,表示該函式是實現的一部分,而不是 Tk 功能的介面。
以下是一些典型用法的示例
import tkinter as tk
class App(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.pack()
# create the application
myapp = App()
#
# here are method calls to the window manager class
#
myapp.master.title("My Do-Nothing Application")
myapp.master.maxsize(1000, 400)
# start the program
myapp.mainloop()
Tk 選項資料型別¶
- anchor
合法值是指南針的點:
"n"
、"ne"
、"e"
、"se"
、"s"
、"sw"
、"w"
、"nw"
,以及"center"
。- bitmap
有八個內建的命名點陣圖:
'error'
、'gray25'
、'gray50'
、'hourglass'
、'info'
、'questhead'
、'question'
、'warning'
。要指定 X 點陣圖檔名,請提供該檔案的完整路徑,並在前面加上@
,如"@/usr/contrib/bitmap/gumby.bit"
。- boolean
您可以傳遞整數 0 或 1 或字串
"yes"
或"no"
。- callback
這是任何不帶引數的 Python 函式。例如
def print_it(): print("hi there") fred["command"] = print_it
- color
顏色可以作為 rgb.txt 檔案中 X 顏色的名稱給出,也可以作為表示 4 位 RGB 值的字串給出:
"#RGB"
、8 位:"#RRGGBB"
、12 位:"#RRRGGGBBB"
或 16 位:"#RRRRGGGGBBBB"
範圍,其中 R、G、B 此處表示任何合法的十六進位制數字。有關詳細資訊,請參見 Ousterhout 的書第 160 頁。- cursor
可以使用
cursorfont.h
中的標準 X 游標名稱,而無需XC_
字首。例如,要獲得手形游標 (XC_hand2
),請使用字串"hand2"
。您還可以指定自己的點陣圖和掩碼檔案。請參見 Ousterhout 的書第 179 頁。- distance
螢幕距離可以指定為畫素或絕對距離。畫素以數字形式給出,絕對距離以字串形式給出,尾隨字元表示單位:
c
表示釐米,i
表示英寸,m
表示毫米,p
表示印表機點。例如,3.5 英寸表示為"3.5i"
。- font
Tk 使用列表字型名稱格式,例如
{courier 10 bold}
。字型大小的正數以點為單位度量;負數的大小以畫素為單位度量。- geometry
這是一個
寬度x高度
形式的字串,其中寬度和高度以畫素為單位測量大多數小部件(對於顯示文字的小部件,以字元為單位)。例如:fred["geometry"] = "200x100"
。- justify
合法值是字串:
"left"
、"center"
、"right"
和"fill"
。- region
這是一個包含四個空格分隔元素的字串,每個元素都是合法的距離值(見上文)。例如:
"2 3 4 5"
和"3i 2i 4.5i 2i"
以及"3c 2c 4c 10.43c"
都是合法的區域。- relief
確定小部件的邊框樣式。合法的值包括:
"raised"
、"sunken"
、"flat"
、"groove"
和"ridge"
。- scrollcommand
這幾乎總是某個捲軸小部件的
set()
方法,但也可以是任何接受單個引數的小部件方法。- wrap
必須是以下之一:
"none"
、"char"
或"word"
。
繫結和事件¶
小部件命令的 bind 方法允許你監視特定事件,並在該事件型別發生時觸發回撥函式。bind 方法的形式如下:
def bind(self, sequence, func, add=''):
其中
- sequence
是一個字串,表示目標事件的型別。(有關詳細資訊,請參閱 bind(3tk) 手冊頁和 John Ousterhout 的著作《Tcl and the Tk Toolkit (第二版)》第 201 頁)。
- func
是一個 Python 函式,接受一個引數,當事件發生時將被呼叫。一個 Event 例項將作為引數傳遞。(以這種方式部署的函式通常被稱為回撥。)
- add
是可選的,可以是
''
或'+'
。傳遞空字串表示此繫結將替換與此事件關聯的任何其他繫結。傳遞'+'
表示此函式將新增到繫結到此事件型別的函式列表中。
例如
def turn_red(self, event):
event.widget["activeforeground"] = "red"
self.button.bind("<Enter>", self.turn_red)
請注意在 turn_red()
回撥中如何訪問事件的 widget 欄位。此欄位包含捕獲 X 事件的小部件。下表列出了您可以訪問的其他事件欄位,以及它們在 Tk 中的表示方式,這在參考 Tk 手冊頁時可能很有用。
Tk |
Tkinter 事件欄位 |
Tk |
Tkinter 事件欄位 |
---|---|---|---|
%f |
focus |
%A |
char |
%h |
height |
%E |
send_event |
%k |
keycode |
%K |
keysym |
%s |
state |
%N |
keysym_num |
%t |
time |
%T |
type |
%w |
width |
%W |
widget |
%x |
x |
%X |
x_root |
%y |
y |
%Y |
y_root |
索引引數¶
許多小部件需要傳遞“索引”引數。這些引數用於指向 Text 小部件中的特定位置,或指向 Entry 小部件中的特定字元,或指向 Menu 小部件中的特定選單項。
- Entry 小部件索引(index、view index 等)
Entry 小部件具有引用正在顯示的文字中的字元位置的選項。您可以使用這些
tkinter
函式來訪問文字小部件中的這些特殊點- Text 小部件索引
Text 小部件的索引表示法非常豐富,最好在 Tk 手冊頁中描述。
- 選單索引(menu.invoke()、menu.entryconfig() 等)
選單的一些選項和方法會操作特定的選單項。當選項或引數需要選單索引時,你可以傳入:
一個整數,它指的是選單項在小部件中的數字位置,從頂部開始計數,從 0 開始;
字串
"active"
,它指的是當前在游標下的選單位置;字串
"last"
,它指的是最後一個選單項;以
@
開頭的整數,例如@6
,其中整數被解釋為選單座標系中的 y 畫素座標;字串
"none"
,表示根本沒有選單項,最常與 menu.activate() 一起使用以停用所有條目,最後,一個文字字串,該字串與選單項的標籤進行模式匹配,從選單的頂部到底部掃描。請注意,此索引型別在所有其他型別之後考慮,這意味著標籤為
last
、active
或none
的選單項的匹配可能會被解釋為上述文字。
影像¶
可以透過 tkinter.Image
的相應子類建立不同格式的影像
BitmapImage
用於 XBM 格式的影像。PhotoImage
用於 PGM、PPM、GIF 和 PNG 格式的影像。後者從 Tk 8.6 開始支援。
這兩種型別的影像都是透過 file
或 data
選項建立的(其他選項也可用)。
在 3.13 版本中更改: 添加了 PhotoImage
方法 copy_replace()
,用於將一個影像中的區域複製到另一個影像,可以進行畫素縮放和/或子取樣。將 from_coords 引數新增到 PhotoImage
方法 copy()
、zoom()
和 subsample()
。將 zoom 和 subsample 引數新增到 PhotoImage
方法 copy()
。
然後,可以在某些小部件(例如,標籤、按鈕、選單)支援 image
選項的任何地方使用影像物件。在這些情況下,Tk 不會保留對影像的引用。當刪除對影像物件的最後一個 Python 引用時,影像資料也會被刪除,Tk 將在使用了影像的任何地方顯示一個空框。
另請參閱
Pillow 包添加了對 BMP、JPEG、TIFF 和 WebP 等格式的支援。
檔案處理器¶
Tk 允許你註冊和登出一個回撥函式,當檔案描述符上可以進行 I/O 操作時,該回調函式將從 Tk 主迴圈中呼叫。每個檔案描述符只能註冊一個處理程式。示例程式碼
import tkinter
widget = tkinter.Tk()
mask = tkinter.READABLE | tkinter.WRITABLE
widget.tk.createfilehandler(file, mask, callback)
...
widget.tk.deletefilehandler(file)
此功能在 Windows 上不可用。
由於你不知道有多少位元組可用於讀取,因此你可能不想使用 BufferedIOBase
或 TextIOBase
read()
或 readline()
方法,因為這些方法會堅持讀取預定義數量的位元組。對於套接字,recv()
或 recvfrom()
方法可以正常工作;對於其他檔案,請使用原始讀取或 os.read(file.fileno(), maxbytecount)
。
- Widget.tk.createfilehandler(file, mask, func)¶
註冊檔案處理程式回撥函式 func。file 引數可以是具有
fileno()
方法的物件(例如檔案或套接字物件),或一個整數檔案描述符。mask 引數是以下三個常數的 OR 組合。回撥按以下方式呼叫callback(file, mask)
- Widget.tk.deletefilehandler(file)¶
登出檔案處理程式。