3 tkinter 基礎(chǔ)概念

參考資源:

  • 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 還有兩個變體:

  1. bind_all:參數(shù)同 bind,作用是綁定到全局
  2. 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)省和修改物喷,以更改特定類的所有小部件的行為。您甚至可以完全修改每個小部件的多個事件序列的處理;如果您好奇商膊,請參閱"綁定標記"命令引用宠进。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市实幕,隨后出現(xiàn)的幾起案子昆庇,更是在濱河造成了極大的恐慌,老刑警劉巖整吆,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件表蝙,死亡現(xiàn)場離奇詭異乓旗,居然都是意外死亡,警方通過查閱死者的電腦和手機汇跨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門穷遂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人塞颁,你說我怎么就攤上這事吸耿⊙拾玻” “怎么了蓬推?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長糕珊。 經(jīng)常有香客問我,道長澜公,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任坟乾,我火速辦了婚禮甚侣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘殷费。我一直安慰自己,他們只是感情好详羡,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布氮采。 她就那樣靜靜地躺著殷绍,像睡著了一般主到。 火紅的嫁衣襯著肌膚如雪躯概。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天牧牢,我揣著相機與錄音姿锭,去河邊找鬼。 笑死轮纫,一個胖子當著我的面吹牛焚鲜,可吹牛的內(nèi)容都是我干的放前。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼凭语,長吁一口氣:“原來是場噩夢啊……” “哼似扔!你這毒婦竟也來了却舀?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤辆脸,失蹤者是張志新(化名)和其女友劉穎螃诅,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體倘是,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡搀崭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年猾编,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片轰传。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡瘪撇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出倔既,到底是詐尸還是另有隱情,我是刑警寧澤码俩,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布歼捏,位于F島的核電站,受9級特大地震影響瞳秽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜袖迎,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一腺晾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧归形,春花似錦鼻由、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至查吊,卻和暖如春蜜自,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背重荠。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留仇参,地道東北人婆殿。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓婆芦,卻偏偏與公主長得像喂饥,于是被迫代替她去往敵國和親肠鲫。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350