參考資源:
- TKDocs:大量的教程,部分可視化組件的介紹說明
Python3.7 已經(jīng)自動集成了 tkinter孝情,無需安裝。
Tk 程序有 3 個基礎(chǔ)概念:部件(widgets)魁亦、幾何管理(geometry management)洁奈、事件處理(event handling)绞灼。下面逐一介紹。
1 Widgets
widgets (有時也稱為 controls(控件)或者 windows(窗口))指代您在屏幕上看到的對象氯哮,包含有 button商佛,entry良姆,labels,frame税课,checkboxes,tree views韩玩,scrollbars,text areas 等等合愈。
1.1 窗口具有層次結(jié)構(gòu)
在 Tk 中所有的 widgets 都是一個單根(root佛析,即最頂層的 widget)的具有層次結(jié)構(gòu)的窗口(Window Hierarchy)彪蓬。當我們創(chuàng)建一個 widget 時必須傳入它的父節(jié)點。比如:
from tkinter import ttk
from tkinter import Tk
root = Tk() # 實例化頂層 widget
content = ttk.Frame(root)
button = ttk.Button(content)
可以使用 str(widget)
獲取該 widget 的層級結(jié)構(gòu)(有點類似于文件的路徑):
str(root), str(content), str(button)
顯示結(jié)果為:
('.', '.!frame', '.!frame.!button')
可以看出 root 是最頂層的膘茎,其次是 content披坏,最后是 button呛牲。
1.2 配置選項
所有的 widgets 均有一些配置選項(configuration options),這些選項控制著 widgets 的行為(即如何表現(xiàn)事件的)和狀態(tài)(即如何被展示的)着茸。下面舉例說明:
root = Tk() # 創(chuàng)建頂層 widget
# 向一個 button 傳入兩個配置選項
button = ttk.Button(root, text='您好', command='buttonpressed')
可以直接使用索引的方式獲取配置信息:
button['text']
顯示結(jié)果為:
'您好'
也可以修改配置信息:
button['text'] = '再見' # 等價于 button.configure(text='再見')
如果需要獲取 'text' 的配置信息涮阔,可以:
button.configure('text')
('text', 'text', 'Text', '', '再見')
如果需要獲取全部的配置信息灰殴,可以運行 button.configure()
命令。一些常用的 widgets:frames, labels, buttons, checkbuttons, radiobuttons, entries and comboboxes伟阔。您也可以使用 dict(button)
獲取 button
的所有屬性信息皱炉。即:
{'command': 'buttonpressed',
'default': <index object: 'normal'>,
'takefocus': 'ttk::takefocus',
'text': '再見',
'textvariable': '',
'underline': -1,
'width': '',
'image': '',
'compound': <index object: 'none'>,
'padding': '',
'state': <index object: 'normal'>,
'cursor': '',
'style': '',
'class': ''}
2 Geometry Management
創(chuàng)建了 widgets 并不能讓其直接在屏幕上顯示狮鸭,這是因為還缺少一個關(guān)鍵的步驟:Geometry Management(幾何管理)。最常用的就是 grid
幾何管理器灾部。
幾何管理器依賴于主部件和從部件(master and slave widgets)的概念設定。母版(master)是一個小部件从藤,它通常是頂層窗口(toplevel window)或框架(frame)春弥,其中包含了其他小部件叠荠,這些小部件被稱為從屬項(slaves)。您可以將幾何管理器當作是在主部件的控制下逃呼,決定著在窗口顯示著些什么內(nèi)容抡笼。
幾何管理器將會詢問每個從屬部件的自然大小黄鳍,或者它理想情況下希望顯示的大小。然后藏古,當它要求幾何管理器管理該特定的從屬部件時忍燥,它會獲取其信息并將其與程序提供的任何參數(shù)相結(jié)合。
幾何管理器獲取有關(guān)從屬的所有信息厂捞,以及有關(guān)主部件大小的信息靡馁,并使用其內(nèi)部算法確定每個從屬部件將分配的區(qū)域机久。每當主參數(shù)的大小發(fā)生變化(例如,因為頂層窗口被調(diào)整大腥褂獭)、從屬窗口的自然大小變化(例如叶圃,因為我們已經(jīng)更改了標簽中的文本)或任何幾何管理器參數(shù)更改(例如,如"row",沉馆,"column"斥黑,或者 "sticky")眉厨。
3 Event Handling
在 Tk 中,與大多數(shù)其他用戶界面工具包一樣鹿蜀,有一個事件循環(huán)(event loop)服球,從操作系統(tǒng)接收事件。這些事件有按鈕按下往枣、擊鍵粉渠、鼠標移動、窗口調(diào)整大小等丈秩。
通常淳衙,Tk 會負責為您管理這些事件循環(huán)箫攀。它將找出事件應用于哪個小部件(用戶是否單擊此按鈕?如果按下了某個鍵缀雳,哪個文本框具有焦點梢睛?)识椰,并相應地調(diào)度它腹鹉。單個小部件知道如何響應事件敷硅;例如,當鼠標移動時力奋,按鈕可能會更改顏色幽七,并在鼠標離開時恢復。
3.1 命令回調(diào)(Command Callbacks)
通常滨彻,盡管您希望程序處理特定事件挪蹭,例如按下按鈕時執(zhí)行某些操作梁厉。對于自定義非常必要的事件(按下按鈕時不發(fā)生某些內(nèi)容踏兜,該按鈕有什么好?)肉盹,小部件將提供一個回調(diào)作為小部件配置選項(widget configuration option)疹尾。比如配置選項的 "command"
參數(shù)纳本。
Tk 中的回調(diào)往往比用于編譯語言的工具包中簡單(其中回調(diào)通常必須針對具有特定參數(shù)集的過程或具有特定簽名的對象方法)。相反吓笙,回調(diào)只是解釋器執(zhí)行的正常代碼巾腕。
3.2 事件綁定
對于沒有與其關(guān)聯(lián)的命令回調(diào)的事件絮蒿,可以使用 Tk 的 "bind"
捕獲任何事件歌径,然后(與回調(diào)類似)執(zhí)行任意代碼段亲茅。下面看一個簡單的例子,它顯示了標簽如何設置綁定以響應不同的事件茵肃,而只需更改標簽中顯示的內(nèi)容即可:
root = Tk()
l = ttk.Label(root, text="Starting...")
l.grid()
l.bind('<Enter>', lambda e: l.configure(text='Moved mouse inside'))
l.bind('<Leave>', lambda e: l.configure(text='Moved mouse outside'))
l.bind('<1>', lambda e: l.configure(text='Clicked left mouse button'))
l.bind('<Double-1>', lambda e: l.configure(text='Double clicked'))
l.bind('<B3-Motion>', lambda e: l.configure(text='right button drag to %d,%d' % (e.x, e.y)))
root.mainloop()
tkinter 希望您將函數(shù)作為事件回調(diào)验残,其第一個參數(shù)是表示觸發(fā)回調(diào)的事件的事件對象(格式為 <modifier-type-detail>
)您没。
-
type
:是 event 的核心胆绊,通常用于描述事件的類型,比如點擊鼠標 -
modifier
:event 的可選部分仆抵,通常用于描述事件的組合鍵种冬,例如Ctrl + S
-
detail
:event 的可選部分,通常用于描述事件的具體按鍵莺匠,例如Button-3
表示鼠標右鍵
下面簡單介紹幾個事件:
事件 | 描述 |
---|---|
<Button-1> |
鼠標事件趣竣,1 代表左鍵纪挎,可簡寫為 <1>
|
<Button-2> |
鼠標事件,2 代表中鍵通砍,可簡寫為 <2>
|
<Button-3> |
鼠標事件,3 代表右鍵迹冤,可簡寫為 <3>
|
<Button-4> |
鼠標事件虎忌,4 代表鼠標滾輪上滾 |
<Button-5> |
鼠標事件膜蠢,5 代表鼠標滾輪下滾 |
<B1-Motion> |
鼠標拖動事件,1 代表左鍵拖動礁竞,還有 2, 3 分別代表中鍵拖動杉辙,右鍵拖動 |
<ButtonRelease-1> |
鼠標按下后釋放 |
<Double-Button-1> |
雙擊鼠標左鍵 |
<Enter> |
表示鼠標指針進入到 widget 里面 |
<Leave> |
表示鼠標指針離開 widget |
<KeyPress-D> |
用戶點擊按鍵 D |
<Control-Shift-KeyPress-Y> |
用戶點擊組合鍵 Ctrl + Shift + Y |
事件對象的屬性:
屬性 | 描述 |
---|---|
widget | 產(chǎn)生的事件的組件 |
x, y | 當前的鼠標相對于窗口的位置蜘矢,單位:像素 |
x_root, y_root | 當前的鼠標相對于電腦顯示屏左上角的位置,單位:像素 |
char | 僅鍵盤事件支持岖食,表示按鍵對應的字符 |
num | 按鈕數(shù)字县耽,僅支持鼠標事件 |
width, height | widget 的大小 |
type | 事件類型 |
對于所有不同的事件名稱镣典、修飾符和每個事件參數(shù)的完整描述兄春,最好查看的是"綁定"命令引用锡溯。
bind
還有兩個變體:
-
bind_all
:參數(shù)同bind
,作用是綁定到全局 -
bind_class
:有 3 個參數(shù)芜茵,即(類名, 事件類型, 對應的操作)
倡蝙,比如:
app.bind_class('ttk.Entry', '<Control-C>', my_copy)
綁定了所有的輸入文本框的Ctrl + C
表示復制
3.3 虛擬事件
除了低級操作系統(tǒng)事件(如鼠標單擊和窗口調(diào)整大小)之外猪钮,許多小部件還生成稱為虛擬事件(Virtual Events)的更高級別事件。例如肘交,列表框小部件("ListboxSelect")將在選擇更改時生成虛擬事件扑馁,無論這是因為用戶單擊了某個項目,還是使用箭頭鍵移動到它等等魄懂。這樣可以避免設置多個(可能是特定平臺的事件綁定)來捕獲更改的問題闯第。
3.4 多重綁定
實際上,小部件可以針對單個事件觸發(fā)(trigger)多個不同的事件綁定填帽。通常咙好,可以為以下設置事件:單個小部件本身、特定類的所有小部件(例如按鈕)嘹悼、包含小部件的頂級窗口以及應用程序中的所有小部件层宫。每一個將依次觸發(fā)。
當我們在頂層窗口中為 Return 鍵設置綁定時限匣,我們在示例中看到了這一點米死,該綁定應用于該窗口中的每個小部件贮庞。
Tk 中每個小部件類的默認行為本身是使用腳本級事件綁定定義的,因此可以進行內(nèi)省和修改物喷,以更改特定類的所有小部件的行為。您甚至可以完全修改每個小部件的多個事件序列的處理;如果您好奇商膊,請參閱"綁定標記"命令引用宠进。