Python Tk GUI系列筆記(tkinter篇(初)) 第一章~第十章
〇、前言
此系列筆記主要介紹tkinter模塊——Tk圖形用戶界面(GUI)及其相關(guān)內(nèi)容
# 準(zhǔn)確來(lái)說(shuō)tkinter在Python中是一個(gè)包
編輯時(shí)內(nèi)容包括:
tkinter、tkinter包內(nèi)的部分模塊、tkinter.ttk模塊、ttkbootstrap、pystray模塊和PIL庫(kù)中的
ImageTk模塊
內(nèi)容參考以下網(wǎng)站:
TkDocs:https://tkdocs.com/(前四十一章)
C語(yǔ)言中文網(wǎng):http://c.biancheng.net/tkinter/(前三十一章)
Python tkinter(GUI編程)模塊最完整教程(上/中/下):(前四十一章)
https://blog.csdn.net/qq_48979387/article/details/125706562
https://blog.csdn.net/qq_48979387/article/details/125806479
https://blog.csdn.net/qq_48979387/article/details/125768994
Python tkinter一些十分靈活的運(yùn)用方式和實(shí)用函數(shù):(第四十二章)
https://blog.csdn.net/qq_48979387/article/details/119695934
tkinter.ttk --- Tk 風(fēng)格的控件:
https://docs.python.org/zh-cn/3.11/library/tkinter.ttk.html(33~41章)
Tcl/Tk文檔:
https://www.tcl.tk/man/tcl8.6/TkCmd/contents.html(前四十二章)
ttkbootstrap:https://ttkbootstrap.readthedocs.io/en/latest/zh/(43~53章)
其他參考會(huì)在章節(jié)前列出
操作系統(tǒng)Windows 7
Python版本在二十三章前使用3.8版本,在二十三章及以后章節(jié)使用3.10版本
運(yùn)行結(jié)果的窗口圖片會(huì)縮放到80%,96 dpi
# gif錄制軟件:ScreenToGif
# 此系列的WPS筆記會(huì)在本系列的最后一個(gè)專欄中給出
顏色代表含義:
淡灰色:注釋,一般前面有#
綠色:示例
橙色:拓展
紫色:示例中的input用戶輸入內(nèi)容
紅色、藍(lán)色:突出或裝飾文字作用
部分內(nèi)容可能不嚴(yán)謹(jǐn)或者錯(cuò)誤,歡迎指出
# 如果Python無(wú)tkinter可參考這篇專欄cv14759634

一、概述
# 以下內(nèi)容摘抄自C語(yǔ)言中文網(wǎng)
·?Tkinter(即tk interface)是Python標(biāo)準(zhǔn)GUI庫(kù),簡(jiǎn)稱“Tk”;從本質(zhì)上來(lái)說(shuō),它是對(duì)TCL/TK工具包的一種Python接口封裝。Tkinter是Python自帶的標(biāo)準(zhǔn)庫(kù),因此無(wú)須另行安裝,它支持跨平臺(tái)運(yùn)行,不僅可以在Windows平臺(tái)上運(yùn)行,還支持在Linux和Mac平臺(tái)上運(yùn)行。
·?Tkinter編寫的程序,也稱為GUI程序,GUI(Graphical User Interface)指的是“圖形用戶界面”,它是計(jì)算機(jī)圖形學(xué)(CG)的一門分支,主要研究如何在計(jì)算機(jī)中表示圖形,以及利用計(jì)算機(jī)進(jìn)行圖形的計(jì)算、處理和顯示等相關(guān)工作
·?一個(gè)GUI程序一般由窗口、下拉菜單或者對(duì)話框等圖形化組件構(gòu)成,通過(guò)鼠標(biāo)點(diǎn)擊菜單欄、按鈕或者彈出對(duì)話框的形式來(lái)實(shí)現(xiàn)人機(jī)互動(dòng),從而提升人機(jī)交互的體驗(yàn),讓“冰冷”的程序變得有“溫度”
二、第一個(gè)Tkinter程序
一個(gè)Tkinter程序至少應(yīng)包含以下四個(gè)部分:
(1)、導(dǎo)入tkinter模塊
使用import語(yǔ)句或from...import...語(yǔ)句:
import tkinter [as 別名]
from tkinter import *
from tkinter import XXX
(2)、創(chuàng)建主窗口
主窗口也稱root窗口(即根窗口):
創(chuàng)建tk模塊中TK類的實(shí)例:tkinter.TK()
(3)、添加人機(jī)交互控件,同時(shí)編寫相應(yīng)的事件函數(shù)
這部分屬于Tkinter編程的重點(diǎn),人機(jī)交互控件例如菜單欄、按鈕或者彈出對(duì)話框等等
(4)、通過(guò)主循環(huán)來(lái)顯示主窗口
告訴Tkinter進(jìn)入主循環(huán),這是所有東西出現(xiàn)在屏幕上并允許用戶與之互動(dòng)的必要條件:
root.mainloop() ?# root是TK類的實(shí)例
# 主循環(huán)也稱“消息循環(huán)”或“事件循環(huán)”
示例1: ?# 沒(méi)有任何交互控件的Tkinter程序
運(yùn)行結(jié)果:
?

示例2: ?# 有文本和按鈕交互控件的Tkinter程序
運(yùn)行結(jié)果:
?

補(bǔ)充:寬度和高度對(duì)于大多數(shù)部件都是以像素為單位,而對(duì)于文本的部件是以字符為單位
補(bǔ)充:pythonw.exe(讓程序獨(dú)立運(yùn)行在Windows環(huán)境下)
Python的安裝目錄里有python.exe和pythonw.exe兩個(gè)程序:
python.exe運(yùn)行程序時(shí)會(huì)彈出CMD窗口
pythonw.exe運(yùn)行程序時(shí)無(wú)窗口,代碼在后臺(tái)執(zhí)行
可以使用pythonw.exe運(yùn)行程序使程序獨(dú)立運(yùn)行在Windows環(huán)境下而不受Python解釋器的影響(這里的不受影響是指不像python.exe運(yùn)行的那樣解釋器關(guān)閉GUI程序也關(guān)閉)
擴(kuò)展名為.py的文件默認(rèn)使用python.exe運(yùn)行,擴(kuò)展名為.pyw文件默認(rèn)使用pythonw.exe運(yùn)行
三、重要的Tk概念
(1)、控件/部件/組件(widget)
Tkinter用戶界面是由一個(gè)個(gè)控件組成的。每個(gè)控件都由相應(yīng)的Python對(duì)象表示,由ttk.Frame,ttk.Label以及ttk.Button這樣的類來(lái)實(shí)例化
# ttk是tkinter中的一個(gè)模塊,實(shí)現(xiàn)Tk風(fēng)格的控件
(2)、控件層級(jí)結(jié)構(gòu)(widget hierarchy)
控件按層級(jí)結(jié)構(gòu)來(lái)組織。標(biāo)簽和按鈕包含在框架中,框架又包含在根窗口中。當(dāng)創(chuàng)建每個(gè)子控件時(shí),它的父控件會(huì)作為控件構(gòu)造器的第一個(gè)參數(shù)被傳入
(3)、配置選項(xiàng)/控件屬性/屬性項(xiàng)(configuration options)
控件具有屬性,屬性會(huì)改變控件的外觀和行為。不同的控件類會(huì)具有不同的屬性集
(4)、幾何管理/布局管理(geometry management)
小部件在創(chuàng)建時(shí)不會(huì)自動(dòng)添加到用戶界面。通過(guò)幾何管理器控制這些小部件在用戶界面的位置
(5)、事件循環(huán)/主循環(huán)/消息循環(huán)(event loop)
只有主動(dòng)運(yùn)行一個(gè)事件循環(huán),Tkinter才會(huì)對(duì)用戶的輸入做出反應(yīng),改變你的程序,以及刷新顯示。如果你的程序沒(méi)有運(yùn)行事件循環(huán),你的用戶界面不會(huì)更新
# 這些概念的譯名后文會(huì)分別使用:控件、控件層級(jí)結(jié)構(gòu)、控件屬性/屬性/屬性項(xiàng)、布局管理、事件循環(huán)/主循環(huán)
# 在后面章節(jié)很少用到widget hierarchy這個(gè)概念
# configuration options一開是使用的Python官方文檔譯名:配置選項(xiàng)/選項(xiàng),但因?yàn)榫W(wǎng)上和GUI編程中以控件屬性作為譯名,所以此后面章節(jié)以控件屬性/屬性/屬性項(xiàng)作為譯名
四、控件屬性的獲取和設(shè)置
(1)、configure(cnf=None, **kw)/config(cnf=None, **kw)
這是控件的兩個(gè)方法,它們是完全等價(jià)的,功能如下:
設(shè)置控件的屬性,屬性的值通過(guò)關(guān)鍵字傳參
如果不帶參數(shù)調(diào)用方法,返回值是一個(gè)字典,鍵是字符串格式的控件允許的屬性名。對(duì)于屬性簡(jiǎn)寫鍵(例如bg,是'background'的簡(jiǎn)寫)的值是一個(gè)二元組:(屬性簡(jiǎn)寫, -屬性全稱);對(duì)于屬性全稱鍵的值是一個(gè)五元組,各索引含義如下:
0:屬性名稱
1:數(shù)據(jù)庫(kù)查找的屬性名稱
2:數(shù)據(jù)庫(kù)查找的屬性類
3:默認(rèn)值
4:當(dāng)前值
cnf——configuration的縮寫,是將控件屬性名稱映射到值的字典,這將設(shè)置對(duì)應(yīng)屬性的當(dāng)前值;或是一個(gè)字符串,這類似于將字符串作為鍵獲取字典的值,但是對(duì)于屬性簡(jiǎn)稱鍵會(huì)獲取屬性全稱鍵的值
示例:
運(yùn)行結(jié)果:
('bg', '-background')
('background', 'background', 'Background', <string object: 'SystemButtonFace'>, 'SystemButtonFace')
('background', 'background', 'Background', 'SystemButtonFace', 'SystemButtonFace')
['bd', 'borderwidth', 'class', 'menu', 'relief', 'screen', 'use', 'background', 'bg', 'colormap', 'container', 'cursor', 'height', 'highlightbackground', 'highlightcolor', 'highlightthickness', 'padx', 'pady', 'takefocus', 'visual', 'width']
?

(2)、keys()
控件的一個(gè)方法,功能如下:
返回控件所有屬性名稱的列表
# 找出控件特有屬性時(shí)可將屬性列表與更簡(jiǎn)單的控件(如框架Frame)的列表進(jìn)行比較
# 同樣找出控件特有方法可使用dir()作比較
示例:
運(yùn)行結(jié)果:
['bd', 'borderwidth', 'class', 'menu', 'relief', 'screen', 'use', 'background', 'bg', 'colormap', 'container', 'cursor', 'height', 'highlightbackground', 'highlightcolor', 'highlightthickness', 'padx', 'pady', 'takefocus', 'visual', 'width']
{'use', 'menu', 'screen'}
66
(3)、設(shè)置控件的屬性
1.在對(duì)象創(chuàng)建時(shí),使用關(guān)鍵字
自定義變量 = 控件類(控件屬性=值, 控件屬性=值, ...)
2.在對(duì)象創(chuàng)建后,將參數(shù)名用作字典索引
自定義變量[控件屬性] = 值
3.利用configure()或config()方法修改對(duì)象的多個(gè)屬性
自定義變量.configure(控件屬性=值, 控件屬性=值, ...)
(4)、關(guān)于后文對(duì)控件屬性的介紹
文檔內(nèi)的介紹控件的屬性時(shí),因?yàn)榭丶扔邢嗤膶傩裕üδ芙苹蛳嗤?,也有不同的。所以介紹時(shí)會(huì)在每章節(jié)的屬性項(xiàng)小節(jié)開頭列出所有的控件屬性,所有的控件屬性整個(gè)文檔都只會(huì)介紹一遍,除非有區(qū)別
同一控件列出的默認(rèn)值都是對(duì)于控件自身來(lái)說(shuō)的,其他控件的默認(rèn)值會(huì)有不同,所以介紹過(guò)的控件屬性會(huì)在小節(jié)最后列出默認(rèn)值和注意事項(xiàng)(在后面章節(jié)沒(méi)介紹的也會(huì)列出)
# 在介紹時(shí)沒(méi)列出默認(rèn)值的一般是無(wú)默認(rèn)值
控件中沒(méi)有列出的屬性,對(duì)當(dāng)前控件無(wú)效果或不常用
# 這里的“沒(méi)有列出的屬性”指的是既沒(méi)在當(dāng)前控件中說(shuō)明又沒(méi)在后面列出默認(rèn)值的屬性
# 對(duì)當(dāng)前控件無(wú)效果的控件也可能在列出默認(rèn)值后面說(shuō)明
# 不止控件有屬性,布局管理器和控件中的對(duì)象(像Canvas中的畫布對(duì)象)也有屬性
# 布局管理器的屬性介紹會(huì)在后面重復(fù)介紹
五、布局管理器
(1)、概念
布局管理器(或形狀管理器, Geometry Manager)用于指定多個(gè)控件在窗口(共同的主控件)內(nèi)的相對(duì)位置,從而實(shí)現(xiàn)對(duì)窗口和控件布局的目的
# 以下三個(gè)布局管理器都是tkinter模塊的類,控件類繼承自它們,有它們的所有方法
(2)、Pack
Pack是一種較為簡(jiǎn)單的布局管理器,按添加順序排列控件。與Place相比,Pack可接受定性的相對(duì)關(guān)系——上面、左面、填充等,并確定精確的位置坐標(biāo)
# 父控件的大小都由其內(nèi)部的子控件大小決定(除非父控件調(diào)用pack_propagate(False))
補(bǔ)充:如果控件2比控件1后被實(shí)例化,則控件2圖層在控件1之上
# 修改堆疊順序見lower()和tkraise()方法
1.pack(cnf={}, **kw)
# 別名:pack_configure, configure, config
# 可通過(guò)別名調(diào)用此方法,其中configure, config在Pack實(shí)例中調(diào)用是此方法,在其他控件中調(diào)用是控件對(duì)應(yīng)設(shè)置控件屬性的方法
將子控件包裝到父控件,屬性如下:
# 使用關(guān)鍵字傳參
anchor:控件在窗口中的對(duì)齊方式,值必須是'n', 'ne', 'e', 'se', 's', 'sw', 'w', 'nw'或'center'。
'center'是默認(rèn)值
# e w s n分別表示東西南北,center表示中間
after, before:值必須是一個(gè)調(diào)用過(guò)pack()的控件,被調(diào)用的控件將會(huì)在傳入值的控件之前/之后進(jìn)行包裝
expand:值為True則在父控件大小增加時(shí),擴(kuò)展子控件;值為False(默認(rèn)值)則不擴(kuò)展
fill:值為'x', 'y', 'both', 'none'。'x', 'y', 'both'分別表示允許控件在水平/垂直/同時(shí)兩個(gè)方向進(jìn)行拉伸,'none'(默認(rèn)值)表示不允許控件進(jìn)行拉伸
# 傳入內(nèi)置常量None等同于字符串'none'
in, in_:指定包裝到的父控件,默認(rèn)為主窗口
# 因?yàn)閕n是關(guān)鍵字,所有關(guān)鍵字傳參時(shí)用in_,使用cnf設(shè)置時(shí)用in或in_
# 這里“父控件”只是在包裝中的父控件,而不是真正的父控件。這可能會(huì)造成包裝后由于子控件堆疊順序低而不顯示在屏幕上,所以建議包裝在控件中的都應(yīng)為它的子控件
ipadx, ipady:指定子控件邊框和內(nèi)容之間的距離(內(nèi)邊距),分別是水平和垂直,默認(rèn)值都為0,單位是像素
padx, pady:指定子控件邊框周圍的空間(外邊距),分別是水平和垂直,默認(rèn)值都為0,單位是像素。如果值是一個(gè)有兩個(gè)值的列表,則這兩個(gè)值分別指定控件兩邊的外邊距(左邊和右邊、上邊和下邊)
# 這里的ipadx, ipady, padx, pady指定的值是每一側(cè)的距離
side:子控件放置在父控件的位置,值為'top', 'bottom', 'left', 'right',分別是頂部/底部/左邊/右邊
cnf——將屬性名稱映射到值的字典
補(bǔ)充:尺寸
控件的長(zhǎng)度、寬度和其他尺寸不僅可以用整數(shù)來(lái)描述:
如果尺寸是一個(gè)整數(shù),則它被認(rèn)為是以像素為單位
如果尺寸是一個(gè)浮點(diǎn)數(shù),則它被認(rèn)為是以像素為單位并四舍五入
如果尺寸是一個(gè)字符串,則它需要是以下形式:
'<整數(shù)/浮點(diǎn)數(shù)><單位>'
其中單位有:
c:厘米
i:英寸
m:毫米
p:打印分辨率(1/72英寸)
尺寸最后都將被轉(zhuǎn)換為像素(通過(guò)dpi)
# 該文檔沒(méi)特殊說(shuō)明的有關(guān)長(zhǎng)度、寬度或其他尺寸的設(shè)置都適用
# 一些地方如果尺寸設(shè)置為負(fù),則代表最小尺寸
示例:
運(yùn)行結(jié)果:
拉伸主窗口前:
?

手動(dòng)拉伸主窗口后:

2.pack_info()
# 別名:info
以字典形式返回關(guān)于控件的包裝屬性的值,控件被包裝后才可調(diào)用,否則引發(fā)_tkinter.TclError
3.pack_forget()
# 別名:forget
解除子控件被包裝到父控件,忽略原有設(shè)置
# 下面兩個(gè)方法應(yīng)由父控件調(diào)用
4.pack_propagate(flag=['_noarg_'])
# 別名:propagate
設(shè)置父控件是否會(huì)自動(dòng)調(diào)節(jié)尺寸以容納所有子控件,默認(rèn)為True。不帶參數(shù)調(diào)用此方法則返回當(dāng)前設(shè)置
5.pack_slaves()
# 別名:slaves
以列表形式返回父控件的所有被包裝的子控件,按其包裝順序排列
# Pack具體工作過(guò)程見https://tcl.tk/man/tcl8.6/TkCmd/pack.htm中的“THE PACKER ALGORITHM”
(3)、Grid
Grid是一種基于網(wǎng)格式的布局管理器,按行列形式排列控件
1.gird(cnf={}, **kw)
別名:grid_configure, configure, config
將子控件以行列形式排列到父控件,屬性如下:
# 使用關(guān)鍵字傳參
column:控件插入的列。窗體最左邊的為起始列(第0列),默認(rèn)值為第0列
row:控件插入的行。窗體最上面的為起始行(第0行),默認(rèn)值為當(dāng)前最大行的下一行
columnspan:控件所跨的列數(shù)。默認(rèn)值為1
rowspan:控件所跨的行數(shù)。默認(rèn)值為1
# columnspan和rowspan會(huì)覆蓋所跨的單元格
sticky:通過(guò)E, W, S, N組合的字符串來(lái)定位子控件在單元格的位置(子控件附在單元格邊界上),默認(rèn)值為空字符串(居中)
# E, W, S, N大小寫均可以
ipadx, ipady, padx, pady:同Pack,默認(rèn)值都為0
cnf——將屬性名稱映射到值的字典
示例1: ?# 打印九九乘法表
運(yùn)行結(jié)果:

示例2: ?# 演示跨行/列
運(yùn)行結(jié)果:

補(bǔ)充:
同一個(gè)控件連續(xù)調(diào)用兩次布局管理器,第二次指定的值會(huì)替代第一次指定的值,沒(méi)指定的繼續(xù)使用第一次指定的值
同一個(gè)父控件Pack和Grid布局管理器不能同時(shí)使用
2.grid_bbox(column=None, row=None, col2=None, row2=None)
# 別名:bbox
# 由父控件調(diào)用
返回一個(gè)4元組描述父控件內(nèi)一些或全部子控件的邊界大小:
(列坐標(biāo), 行坐標(biāo), 寬度, 高度),前兩個(gè)數(shù)指定父控件中左上角的偏移量(也就是一個(gè)點(diǎn)的坐標(biāo)),后兩個(gè)數(shù)指定了寬度和高度(向右和下延伸)
如果沒(méi)給出參數(shù),則返回的參數(shù)是描述全部單元格的邊界大小
如果給出column和row,則返回的參數(shù)是描述指定坐標(biāo)的單元格的邊界大小
如果給出column, row, col2, row2則返回參數(shù)是描述(column, row)單元格到(col2, row2)單元格的邊界大小
傳入的參數(shù)都是坐標(biāo)(可以是負(fù)的),返回的值都是以像素為單位
# 因?yàn)門kinter在屏幕上繪制控件之前不會(huì)計(jì)算坐標(biāo),所以在主循環(huán)啟動(dòng)后或調(diào)用此方法之前調(diào)用主窗口root的root.update()方法強(qiáng)制繪制窗口才能得到結(jié)果
示例:
運(yùn)行結(jié)果:
(0, 0, 250, 250)
(200, 200, 50, 50)
(100, 100, 150, 150)
(0, 100, 100, 150)

3.grid_info()
# 別名:info
以字典形式返回關(guān)于控件的Grid屬性的值,控件調(diào)用grid()前調(diào)用此函數(shù)返回空字典
4.grid_forget()
# 別名:forget
解除子控件被排列到父控件,忽略原有設(shè)置
5.grid_propagate(flag=['_noarg_'])
# 別名:propagate
同Pack.pack_propagate()
6.grid_slaves(row=None, column=None)
# 別名:slaves
以列表形式返回父控件指定行列的所有被包裝的子控件,按其包裝順序排列。參數(shù)值為None代表任意行列
7.grid_size()
# 別名:size
返回網(wǎng)格大小的二元組:(列數(shù), 行數(shù))
8.grid_remove()
解除子控件被排列到父控件,記住原有設(shè)置
9.grid_location(x, y)
# 別名:location
返回位于給定坐標(biāo)(x, y)的網(wǎng)格位置(x, y單位都是像素),返回值是一個(gè)二元組:(列, 行)
# 此方法不用在主循環(huán)或root.update()之后使用
10.grid_rowconfigure(index, cnf={}, **kw)
# 別名:rowconfigure
如果給出屬性項(xiàng),則設(shè)置指定行index的屬性;否則獲取指定行index的屬性,屬性項(xiàng)如下:
minsize:該行的最小高度,單位是像素,默認(rèn)值為0
pad:該行中最大網(wǎng)格垂直邊距,單位是像素,默認(rèn)值為0
# 垂直邊距是與上下兩邊的距離,如果值為奇數(shù)則優(yōu)先與下邊距離遠(yuǎn)
weight:該行占額外空間的權(quán)重,是一個(gè)整數(shù),默認(rèn)值為0
uniform:可以是任意值,同一控件的不同行如果有除None以外的相同值則將它們放在同一組中。為屬于同一組的行按weight值分配空間,所以它們的大小始終與weight值嚴(yán)格成比例。默認(rèn)值為None
cnf——同Pack.pack()
11.grid_columnconfigure(index, cnf={}, **kw)
# 別名:columnconfigure
如果給出屬性項(xiàng),則設(shè)置指定列index的屬性;否則獲取指定列index的屬性,屬性項(xiàng)如下:
minsize:該列的最小寬度,單位是像素,默認(rèn)值為0
pad:該列中最大網(wǎng)格水平邊距,單位是像素,默認(rèn)值為0
# 水平邊距是與左右兩邊的距離,如果值為奇數(shù)則優(yōu)先與右邊距離遠(yuǎn)
weight:該列占額外空間的權(quán)重,是一個(gè)整數(shù),默認(rèn)值為0
uniform:同Grid.grid_rowconfigure()
cnf——同Pack.pack()
示例:
運(yùn)行結(jié)果:

(4)、Place
Place進(jìn)行布局管理更加精細(xì)化,可以直接指定控件在窗體內(nèi)的絕對(duì)位置,或者相對(duì)于其他控件定位的相對(duì)位置,也可以指定控件的大小
# Place布局管理器不會(huì)自動(dòng)調(diào)節(jié)父控件的大小
1.place(cnf={}, **kw)
# 別名:place_configure, configure, config
將子控件定位到父控件,屬性如下:
# 使用關(guān)鍵字傳參
in, in_:指定定位到的父控件,默認(rèn)為主窗口
anchor:在子控件內(nèi)的錨點(diǎn)位置,值必須是'n', 'ne', 'e', 'se', 's', 'sw', 'w', 'nw'或'center'。'nw'是默認(rèn)值
x, y:子控件相對(duì)于錨點(diǎn)水平和垂直偏移位置,單位是像素,默認(rèn)值都為0
relx, rely:子控件相對(duì)于父控件的水平和垂直位置,默認(rèn)值都為0
# 同時(shí)指定x, relx/y, rely,relx/rely優(yōu)先生效,再根據(jù)x/y相對(duì)于生效后錨點(diǎn)偏移
width, height:控件的寬度和高度,單位是像素,默認(rèn)值都為空字符串,表示控件設(shè)置
relwidth, relheight:子控件相對(duì)于父控件的寬度和高度,默認(rèn)值都為空字符串
# 同時(shí)指定width, relwidth/height, relheight,relwidth/relheight優(yōu)先生效,再加上width/height指定的寬度/高度。width/height可以是負(fù)數(shù),在這里代表減去的值而不是最小寬度/高度
# relx, rely, relwidth, relheight為1.0分別表示右邊、底邊、相同寬度和相同高度
# relx, rely, relwidth, relheight可以大于1.0或?yàn)樨?fù)數(shù)。relwidth, relheight為負(fù)數(shù)相當(dāng)于為0.0,大于1.0是父控件寬度和高度的倍數(shù);relx, rely為負(fù)數(shù)則位置向左,大于1.0是父控件水平和垂直位置的倍數(shù)
bordermode:子控件定位時(shí),是否考慮父控件的的邊框,'inside'(默認(rèn)值)是不考慮,'outside'或'ignore'是考慮
# 例如Label控件指定highlightthickness設(shè)置高亮邊框?qū)挾?/span>
# Canvas控件指定highlightthickness設(shè)置的高亮邊框總會(huì)被考慮
# 關(guān)于該屬性進(jìn)一步的詳細(xì)介紹見https://tcl.tk/man/tcl8.6/TkCmd/place.htm
cnf——將屬性名稱映射到值的字典
# 無(wú)參數(shù)調(diào)用此方法不會(huì)將子控件定位到父控件
示例1:
運(yùn)行結(jié)果:
拉伸前:

橫向拉伸后:

示例2:
運(yùn)行結(jié)果:

2.place_info()
# 別名:info
以字典形式返回關(guān)于控件的Place屬性的值,控件調(diào)用place()前調(diào)用此函數(shù)返回空字典
3.place_forget()
# 別名:forget
解除子控件被定位到父控件,忽略原有設(shè)置
4.place_slaves()
以列表形式返回父控件的所有被定位的子控件,按其包裝順序排列
補(bǔ)充:Tkinter中的坐標(biāo)系
以左上角為原點(diǎn)(0, 0),X坐標(biāo)向右增加,Y坐標(biāo)向下增加。基本單位是像素
補(bǔ)充:Place布局管理器和其他布局管理器共用
Place布局管理器可以和Pack布局管理器或Grid布局管理器共用。共用時(shí)要注意控件的堆疊順序以防一個(gè)控件遮蓋另一個(gè)控件
示例:
運(yùn)行結(jié)果:

補(bǔ)充:tkinter模塊中的常量
tkinter模塊中有一些像E, DISABLED, BOTH這樣的常量,它們的值都是常量名對(duì)應(yīng)的字符串,方便傳參
在tkinter.constants模塊中可以查看,下面列出其中所有的常量
布爾值:
NO=FALSE=OFF=0
YES=TRUE=ON=1
用于anchor和sticky:
N, S, W, E, NW, SW, NE, SE, NS, EW, NSEW, CENTER
用于fill:
NONE, X, Y, BOTH
用于side:
LEFT, TOP, RIGHT, BOTTOM
用于relief:
RAISED, SUNKEN, FLAT, RIDGE, GROOVE, SOLID
用于orient:
HORIZONTAL, VERTICAL
用于tabs:
NUMERIC
用于wrap:
CHAR, WORD
用于align:
BASELINE
用于bordermode:
INSIDE, OUTSIDE
特殊標(biāo)簽、標(biāo)記和插入位置:
SEL, SEL_FIRST, SEL_LAST, END, INSERT, CURRENT, ANCHOR, ALL
文本控件和按鈕控件的狀態(tài):
NORMAL, DISABLED, ACTIVE
畫布控件的狀態(tài):
HIDDEN
菜單項(xiàng)類型:
CASCADE, CHECKBUTTON, COMMAND, RADIOBUTTON, SEPARATOR
列表框的選擇模式:
SINGLE, BROWSE, MULTIPLE, EXTENDED
列表框active line樣式:
NONE, DOTBOX, UNDERLINE
畫布的各種樣式:
PIESLICE, CHORD, ARC, FIRST, LAST, BUTT, PROJECTING, ROUND, BEVEL, MITER
用于xview, yview:
MOVETO, SCROLL, UNITS, PAGES
六、主窗口(Tk)與控件對(duì)象部分方法
(1)、構(gòu)造方法
tkinter.Tk(screenName=None, baseName=None, className='Tk', useTk=True, sync=False, use=None)
構(gòu)造一個(gè)最高層級(jí)的Tk控件,這通常是一個(gè)應(yīng)用程序的主窗口,并為這個(gè)控件初始化Tcl解釋器。每個(gè)實(shí)例都有其格自所關(guān)聯(lián)的Tcl解釋器
# Tk類通常全部使用默認(rèn)值來(lái)初始
className——控件類的名稱。會(huì)被用作預(yù)置文件同時(shí)也作為Tcl發(fā)起調(diào)用的名稱,默認(rèn)值為'Tk'
# 會(huì)被用作窗口的標(biāo)題
# 參數(shù)具體說(shuō)明見https://docs.python.org/zh-cn/3.12/library/tkinter.html
(2)、屬性項(xiàng)
bd, borderwidth, class, menu, relief, screen, use, background, bg, colormap, container, cursor, height, highlightbackground, highlightcolor, highlightthickness, padx, pady, takefocus, visual, width
# colormap, visual屬性分別是顏色映射和框架顯示,大部分取值是針對(duì)過(guò)去低端的顯示設(shè)備,這里不詳細(xì)說(shuō)明
# menu屬性在Menu控件中說(shuō)明
# class屬性在“屬性項(xiàng)數(shù)據(jù)庫(kù)”章節(jié)中說(shuō)明
# use屬性將在Toplevel控件中說(shuō)明
1.background或bg
指定控件的背景顏色,默認(rèn)值由系統(tǒng)指定,為防止更新可設(shè)置為空字符串
補(bǔ)充:顏色
在Tkinter中一般有兩種方法來(lái)指定顏色
1.顏色的十六進(jìn)制數(shù),即紅、綠、藍(lán)三種顏色不同比例的混合色:
#rgb:每種顏色四位
#rrggbb:每種顏色八位
#rrrgggbbb:每種顏色十二位
# 十六進(jìn)制字母小寫大小都可以
2.本地定義的標(biāo)準(zhǔn)顏色名稱:
'white', 'black' 'red', 'green', 'blue', 'cyan', 'yellow'和'magenta'顏色名稱始終可用。其他顏色名稱取決于本地環(huán)境
# 'green'對(duì)應(yīng)的十六進(jìn)制數(shù)是#008000,'green1'對(duì)應(yīng)的十六進(jìn)制數(shù)是#00ff00
# 其他顏色名稱見https://tcl.tk/man/tcl8.6/TkCmd/colors.htm
2.width, height
指定控件的寬度和高度,文本控件以字符為單位,其他控件以像素為單位,默認(rèn)值為0
3.relief
指定控件的邊框樣式(3D效果),參數(shù)值為'flat'(平的), 'raised'(凸起的), 'sunken'(凹陷的), 'groove'(溝槽樁邊緣), 'ridge'(脊?fàn)钸吘墸? 'solid'(實(shí)心),默認(rèn)值為'flat'
瀏覽圖如下:

4.borderwidth或bd
指定控件的邊框?qū)挾?,單位是像素,默認(rèn)值為0
# 邊框樣式只有在邊框?qū)挾炔粸?是才能顯示
5.highlightthickness
指定控件的高亮邊框的寬度,單位是像素,默認(rèn)值為0
# 高亮邊框就是當(dāng)控件有焦點(diǎn)時(shí)圍繞在周圍的矩形
6.highlightcolor
當(dāng)控件獲得焦點(diǎn)時(shí)高亮邊框的顏色,默認(rèn)值由系統(tǒng)指定
7.highlightbackground
當(dāng)控件沒(méi)獲得焦點(diǎn)時(shí)高亮邊框的顏色,默認(rèn)值由系統(tǒng)指定
示例:??# 高亮邊框的示例
運(yùn)行結(jié)果:
有焦點(diǎn):

無(wú)焦點(diǎn):

8.cursor
當(dāng)鼠標(biāo)移動(dòng)到控件上時(shí)的鼠標(biāo)樣式,可選值參見:
https://tcl.tk/man/tcl8.6/TkCmd/cursors.htm
https://tkdocs.com/shipman/cursors.html??# 具體顯示由操作系統(tǒng)決定
舉例:arrow(箭頭), plus(加號(hào)), crosshair(十字線), fleur(十字花), watch(待加載圓圈), xterm(輸入光標(biāo)), X_cursor(X型光標(biāo))
# 不區(qū)分大小寫
9.takefocus
當(dāng)值為1時(shí),焦點(diǎn)可以通過(guò)TAB鍵移動(dòng)到控件上;否則當(dāng)值為0時(shí),焦點(diǎn)不可以通過(guò)TAB鍵移動(dòng)到控件上。默認(rèn)值為0
10.screen
指定放置新窗口的屏幕。任何有效的屏幕名稱都可使用
(3)、部分方法
# 這里即包括控件對(duì)象共有的方法,又包括窗口控件的方法,所以非常多
# 如果只是想看主窗口控件的方法,可以從83個(gè)方法開始?;蚴翘^(guò)此章節(jié)剩余部分,先查看后面的幾個(gè)控件再?gòu)倪@里開始。或是直接從這里開始查看不跳過(guò)(個(gè)人在編寫的時(shí)候是先編寫這些方法的)
# 有些方法或方法的參數(shù)牽連到其他知識(shí),會(huì)只寫出而不做具體介紹
1.report_callback_exception(exc, val, tb)
將回調(diào)而引發(fā)的異常輸出到sys.stderr
# 需要自定義可將另一個(gè)3個(gè)參數(shù)的函數(shù)賦值給此函數(shù)
以下是全局方法,這些方法適用于所有控件,但在全局范圍內(nèi)有效,而不是作用于單個(gè)控件。按照慣例,應(yīng)由主窗口控件調(diào)用
2.bell(displayof=0)
鳴響displayof所在的顯示器的震鈴,默認(rèn)使用應(yīng)用的主窗口的顯示器
# '.'表示主窗口
3.deletecommand(name)
刪除name中提供的Tcl命令,name是一個(gè)字符串
# str(widget)返回控件的name
4.getboolean(s)
返回一個(gè)布爾值
s——是一個(gè)字符串。如果是'0', 'false', 'no'或'off'中的任何一個(gè),則返回False;如果是'1', 'true', 'yes', 'on'中的任何一個(gè),則返回True。這些值都可以縮寫(除了'o')且不區(qū)分大小寫
# 雖然s也可以是數(shù)值類型
5.getint(s)
返回一個(gè)十進(jìn)制整數(shù)
s——是一個(gè)字符串。前后可以留空白,可以帶符號(hào),在空白和符號(hào)之后的字符為'0x'則為十六進(jìn)制、'0o'或'0'則為八進(jìn)制形式、'ob'則為二進(jìn)制形式
6.getdouble(s)
返回一個(gè)浮點(diǎn)數(shù)
s——是一個(gè)字符串。形式:[空白][符號(hào)][數(shù)字]['.'數(shù)字]['e'[符號(hào)]數(shù)字][空白]
7.setvar(name='PY_VAR', value='1')
設(shè)置Tcl變量name的值value
8.getvar(name='PY_VAR')
返回Tcl變量name的值
9.mainloop(n)
事件循環(huán),直到所有窗口被關(guān)閉
n——當(dāng)主窗口數(shù)量下降到n時(shí)退出事件循環(huán)并繼續(xù)執(zhí)行代碼
示例:
運(yùn)行結(jié)果:
開始事件循環(huán)
# 出現(xiàn)5個(gè)窗口
# 關(guān)到剩3個(gè)窗口時(shí),3個(gè)窗口未響應(yīng)
結(jié)束事件循環(huán)
# 五秒后
執(zhí)行結(jié)束
# 3個(gè)窗口被關(guān)閉
10.quit()
退出Tcl解釋器。所有控件都將被銷毀
11.nametowidget(name)
返回名為name的控件
name——是一個(gè)字符串或控件
# name如果傳入控件則返回控件本身
# 也就是返回控件的標(biāo)識(shí)符
12.after(ms, func=None, *args)
等待毫秒ms后調(diào)用func并使用args作為傳入的位置參數(shù)。返回用于after_cancel()取消調(diào)度的標(biāo)識(shí)符
# 此方法在調(diào)用時(shí)就直接返回并開始計(jì)時(shí),事件循環(huán)時(shí)才調(diào)用函數(shù)
13.after_idle(func, *args)
如果Tcl主循環(huán)沒(méi)有事件需要處理,就調(diào)用func并使用args作為傳入的位置參數(shù)。返回用于after_cancel()取消調(diào)度的標(biāo)識(shí)符
14.after_cancel(id)
取消標(biāo)識(shí)符id的函數(shù)的調(diào)度
15.clipboard_get(**kw)
讀取并返回剪貼板的內(nèi)容,可選關(guān)鍵字參數(shù)如下:
displayof:讀取指定displaypf所在的顯示器上的剪貼板,默認(rèn)值為Tkinter的主窗口
type:指定返回?cái)?shù)據(jù)的形式,是一個(gè)原子名稱,默認(rèn)值為'STRING',詳情參見客戶間通信協(xié)定手冊(cè)(ICCCM)
# 在X11上,默認(rèn)值先嘗試'UTF8_STRING',失敗后退回'STRING'
此方法相當(dāng)于:
selection_get(selection='CLIPBOARD')
# 如果剪貼框內(nèi)容不存在或不是文本類型會(huì)引發(fā)TclError異常
16.clipboard_clear(**kw)
清空剪貼板中的內(nèi)容,可選關(guān)鍵字參數(shù)如下:
displayof:同clipboard_get()
17.clipboard_append(string, **kw)
將string追加到剪貼板中,可選關(guān)鍵字參數(shù)如下:
displayof, type:同clipboard_get()
format:指定用來(lái)把選擇傳輸?shù)秸?qǐng)求者的表示法,默認(rèn)值為'STRING'
# 追加前會(huì)清空剪貼板中的內(nèi)容,且在調(diào)用mainloop()時(shí)才真正添加到剪貼板
18.tk_bisque()
將顏色方案改為Tk 3.6及以前使用的淺棕色
19.tk_focusFollowsMouse()
鼠標(biāo)下的控件會(huì)自動(dòng)獲得焦點(diǎn)。不容易被禁用
# 需要主窗口先得到焦點(diǎn),且控件的takefocus選項(xiàng)不為False或0
示例:
運(yùn)行結(jié)果:
# 焦點(diǎn)在其中一個(gè)輸入框,并能直接輸入文本

20.tk_focusNext()
21.tk_focusPrev()
返回當(dāng)前擁有焦點(diǎn)的控件的焦點(diǎn)順序的下一個(gè)/上一個(gè)控件
焦點(diǎn)順序首先到下一個(gè)子控件,然后遞歸到子控件的子控件,然后到堆疊順序中的下一個(gè)同級(jí)控件。如果控件的takefouces屬性設(shè)置為0,則它被忽略
# 后創(chuàng)建的控件堆疊在先創(chuàng)建控件的上面
# 設(shè)置控件的堆疊順序見lower()和tkraise()方法
22.tk_setPalette(*args, **kw)
為所有控件設(shè)置一個(gè)新的顏色方案
如果只傳入一個(gè)參數(shù),則這個(gè)參數(shù)是用來(lái)設(shè)置背景顏色
如果傳入多個(gè)參數(shù),則參數(shù)的個(gè)數(shù)必須是偶數(shù)個(gè),每?jī)蓚€(gè)參數(shù)的第一個(gè)指定屬性名稱,第二個(gè)指定顏色(屬性的新值)
如果傳入序列,則將序列扁平化(轉(zhuǎn)成一維)后將每個(gè)元素作為位置參數(shù)
此外可以使用關(guān)鍵字傳參,鍵是屬性名稱,值是指定顏色
調(diào)用此方法,必須有一個(gè)是設(shè)置背景顏色
支持以下屬性名稱:
activeBackground, foreground, selectColor, activeForeground, highlightBackground, selectBackground, background, highlightColor, selectForeground, disabledForeground, insertBackground, troughColor
示例:
運(yùn)行結(jié)果:
有焦點(diǎn):

無(wú)焦點(diǎn):

23.tk_strictMotif(boolean=None)
設(shè)置Tcl內(nèi)置變量tk_strictMotif的值,外觀和感覺(jué)是否遵循Motif,默認(rèn)值為0。值為1意味堅(jiān)持Motif(例如鼠標(biāo)經(jīng)過(guò)滑塊不會(huì)改變顏色)
返回設(shè)置后的值。如果沒(méi)傳入?yún)?shù),則返回當(dāng)前值
24.update()
進(jìn)入事件循環(huán),直到所有待處理的事件都被Tcl處理完畢
25.update_idletasks()
進(jìn)入事件循環(huán),直到所有的空閑回調(diào)都被調(diào)用。這將更新窗口的顯示,但不處理由用戶引起的事件
# 空閑回調(diào)是after_idle()方法
# 與update()的區(qū)別是只會(huì)處理空閑回調(diào),像控件包裝之類的不會(huì)處理
示例:
運(yùn)行結(jié)果1:
func()被調(diào)用

運(yùn)行結(jié)果2:??# 將14行改為root.update_idletasks()
func()被調(diào)用

26.wait_variable(name='PY_VAR')
# 別名:waitvar
阻塞,直到變量name被修改
# 阻塞時(shí)會(huì)進(jìn)行主循環(huán),變量name是Tcl變量
27.wait_visibility(window=None)
阻塞,直到控件window的可見性發(fā)生變化。如果沒(méi)給出參數(shù)則使用self
# 實(shí)測(cè)當(dāng)控件所處窗口最大化,最小化和控件出現(xiàn)時(shí)會(huì)結(jié)束等待
28.wait_window(window=None)
阻塞,直到控件window被銷毀。如果沒(méi)給出參數(shù)則使用self
# 調(diào)用控件的destroy()方法銷毀控件
# 后文所說(shuō)的調(diào)用控件指調(diào)用方法的控件
?
以下方法繼承自父類Misc,所有控件都可調(diào)用
29.cget(key)
以字符串形式返回控件屬性key的值
30.configure(cnf=None, **kw)
# 別名:config
見四、(1)
31.destroy()
銷毀調(diào)用的控件和它的子控件
32.keys()
返回控件所有屬性名稱的列表
33.lower(belowThis=None)
將調(diào)用控件的堆疊順序降到控件belowThis的下面
省略belowThis則將其堆疊順序降到最低
34.tkraise(aboveThis=None)
# 別名:lift
將調(diào)用控件的堆疊順序升到控件aboveThis的上面
省略belowThis則將其堆疊順序升到最高
補(bǔ)充:堆疊順序低的用TAB自動(dòng)選擇焦點(diǎn)時(shí)先被選擇
補(bǔ)充:如果一個(gè)控件想要在另一個(gè)控件之上,包括使用布局管理器和控件自帶方法,必須確保這個(gè)控件的堆疊順序高于另一個(gè)控件,否則不會(huì)顯示
# 子控件堆疊順序總高于父控件
35.focus_get()
返回當(dāng)前應(yīng)用程序中擁有焦點(diǎn)的控件。如果應(yīng)用程序沒(méi)有焦點(diǎn)則返回None
36.focus_displayof()
返回調(diào)用控件所在顯示器上擁有焦點(diǎn)的控件。如果應(yīng)用程序沒(méi)有焦點(diǎn)則返回None
37.focus_lastfor()
返回窗口激活后將獲得焦點(diǎn)的控件。與focus_get()不同的是如果應(yīng)用程序沒(méi)有焦點(diǎn)也會(huì)返回?fù)碛薪裹c(diǎn)后將獲得焦點(diǎn)的控件
# 因?yàn)樾枰{(diào)用root.update()來(lái)更新窗口(讓控件出現(xiàn)在窗口上),所以在沒(méi)更新窗口之前調(diào)用此函數(shù)通常返回主窗口控件
38.focus_set()
# 別名:focus
將焦點(diǎn)指向調(diào)用控件。如果應(yīng)用程序當(dāng)前沒(méi)有焦點(diǎn),則一旦應(yīng)用程序通過(guò)窗口管理器獲得焦點(diǎn),調(diào)用控件將獲得焦點(diǎn)
39.focus_force()
將焦點(diǎn)指向調(diào)用控件,即使應(yīng)用程序沒(méi)有焦點(diǎn)。請(qǐng)謹(jǐn)慎使用!
40.grab_set()
將調(diào)用控件設(shè)置焦點(diǎn)抓取
如果設(shè)置焦點(diǎn)抓取,則在應(yīng)用程序中只能操作焦點(diǎn)抓取的控件和它的子控件(所有事件只能在該控件處理)
# 實(shí)測(cè)同時(shí)只能一個(gè)控件設(shè)置焦點(diǎn)抓取
41.grab_set_global()
將調(diào)用控件設(shè)置全局焦點(diǎn)抓取。請(qǐng)謹(jǐn)慎使用——其他應(yīng)用程序不會(huì)再得到事件
# 例如在多進(jìn)程中,設(shè)置其中一個(gè)進(jìn)程的一個(gè)控件全局焦點(diǎn)抓取,另一個(gè)進(jìn)程的窗口不能再操作
42.grab_current()
返回當(dāng)前應(yīng)用程序中被焦點(diǎn)抓取的控件,如果沒(méi)有則返回None
43.grab_status()
返回調(diào)用控件的焦點(diǎn)抓取狀態(tài):None, 'local', 'global'
44.grab_release()
釋放控件焦點(diǎn)抓取
45.winfo_atom(name, displayof=0)
返回原子名稱name的整數(shù)標(biāo)識(shí)符。如果沒(méi)有以name命名的原子存在,則新創(chuàng)建一個(gè)原子
displayof——在指定displaypf所在的顯示器上尋找,默認(rèn)值在主窗口的顯示器上尋找
46.winfo_atomname(id, displayof=0)
返回整數(shù)表示符為id的原子名稱,原子不存在會(huì)引發(fā)TclError
displayof:同winfo_atom()
47.winfo_children()
返回調(diào)用控件所有子控件的列表
48.winfo_parent()
返回調(diào)用控件父控件的名稱,如果父控件是主窗口則返回空字符串
49.winfo_class()
返回調(diào)用控件的控件類名
# 像創(chuàng)建控件類的子類然后創(chuàng)建實(shí)例調(diào)用此方法會(huì)返回控件類名而不是子類名
# 主窗口控件的類名可在構(gòu)建時(shí)傳入className參數(shù)指定
50.winfo_containing(rootX, rootY, displayof=0)
返回位于電腦屏幕rootX, rootY的控件
displayof:同winfo_atom()
示例:
運(yùn)行結(jié)果:
.!canvas
.!canvas2
.!canvas2

51.winfo_depth()
返回像素位深度(每個(gè)像素所用的位數(shù))
52.winfo_exists()
如果調(diào)用控件存在則返回1,否則返回0
53.winfo_fpixels(number)
返回給定距離number(例如'3c')的像素值,是一個(gè)浮點(diǎn)數(shù)
54.winfo_pixels(number)
返回winfo_fpixels()的四舍五入指,是一個(gè)整數(shù)
55.winfo_geometry()
返回調(diào)用控件的geometry string:"widthxheight+X+Y"
# 未進(jìn)入主循環(huán)前需要先調(diào)用root.update()來(lái)更新窗口(映射控件)
補(bǔ)充:geometry string
geometry string是描述桌面上頂層窗口的大小和位置的標(biāo)準(zhǔn)方式,形式如下:
'wxh±x±y'
其中x, ±都是字符,±表示'+'或'-'。有以下三種形式:
'wxh', '±x±y', 'wxh±x±y'
w, h:窗口的寬度和高度,單位是像素
x:如果為+x則是距離桌面左邊有x個(gè)像素;如果為-x則是距離桌面右邊有y個(gè)像素
y:如果為+y則是距離桌面上邊有y個(gè)像素;如果為-y則是距離桌面下邊有y個(gè)像素
56.winfo_width()
返回調(diào)用控件的寬度
57.winfo_height()
返回調(diào)用控件的高度
# 以上兩個(gè)方法需要先映射控件,值會(huì)隨著窗口的改變而更新
58.winfo_reqwidth()
返回調(diào)用控件的請(qǐng)求寬度
59.winfo_reqheight()
返回調(diào)用控件的請(qǐng)求高度
# 以上兩個(gè)方法不需要先映射控件,值不會(huì)隨著窗口的改變而更新
# 注意窗口控件調(diào)用返回的寬度和高度不包括窗口邊框
60.winfo_rootx()
返回調(diào)用控件在桌面左上角的x坐標(biāo)
61.winfo_rooty()
返回調(diào)用控件在桌面左上角的y坐標(biāo)
62.winfo_x()
返回調(diào)用控件在窗口左上角的x坐標(biāo)
63.winfo_y()
返回調(diào)用控件在窗口左上角的y坐標(biāo)
64.winfo_id()
返回調(diào)用控件的標(biāo)識(shí)符ID
65.winfo_interps(displayof=0)
返回displaypf所在的顯示器上的所有Tcl解釋器的名稱
66.winfo_ismapped()
如果調(diào)用控件被映射(可見)則返回1,否則返回0
67.winfo_viewable()
如果調(diào)用控件和它的父控件都被映射則返回1,否則返回0
68.winfo_manager()
返回調(diào)用控件布局管理器的名稱,無(wú)則返回空字符串
# 例如pack, grid, place,如果布局管理器是一個(gè)控件,則返回控件類的類名
69.winfo_name()
返回調(diào)用控件的名稱
70.winfo_pathname(id, displayof=0)
返回給定ID的路徑名稱
71.winfo_pointerx()
72.winfo_pointery()
73.winfo_pointerxy()
如果鼠標(biāo)指針與窗口在同一屏幕上,則分別是返回鼠標(biāo)指針的x坐標(biāo)、y坐標(biāo)、(x坐標(biāo), y坐標(biāo))。如果不在同一屏幕上則返回-1
74.winfo_rgb(color)
返回顏色color的RGB色彩值。返回一個(gè)三元組,每個(gè)值在0和65535之間
75.winfo_server()
返回屏幕的服務(wù)器信息
76.winfo_toplevel()
返回調(diào)用控件的頂級(jí)窗口控件
77.winfo_screen()
返回與窗口相關(guān)的屏幕名稱
78.winfo_screendepth()
返回與窗口相關(guān)的屏幕的像素位深度(每個(gè)像素所用的位數(shù))
79.winfo_screenwidth()
返回與窗口相關(guān)的屏幕的寬度,單位是像素
80.winfo_screenheight()
返回與窗口相關(guān)的屏幕的高度,單位是像素
81.winfo_screenmmwidth()
返回與窗口相關(guān)的屏幕的寬度,單位是毫米
82.winfo_screenmmheight()
返回與窗口相關(guān)的屏幕的高度,單位是毫米
?
以下方法繼承自父類Wm,只有Tk和Toplevel控件才可調(diào)用
# Wm是Window manager(窗口管理器)的縮寫
83.wm_aspect(minNumer=None, minDenom=None, maxNumer=None, maxDenom=None)
別名:aspect
指示窗口管理器將調(diào)用控件的寬高比(寬度/高度)設(shè)置為minNumer / minDenom和maxNumer / maxDenom之間。如果都指定為空字符串,則原有限制將刪除。如果沒(méi)給出參數(shù),則返回(minNumer, minDenom, maxNumer, maxDenom)(如果沒(méi)有設(shè)置則返回None)
# 實(shí)測(cè)在Windows 7上無(wú)效果
84.wm_attributes(*args)
別名:attributes
返回或設(shè)置窗口各項(xiàng)平臺(tái)特定屬性
無(wú)參數(shù)調(diào)用會(huì)返回平臺(tái)特定屬性和其值的列表
一個(gè)參數(shù)調(diào)用需要參數(shù)是屬性名稱,會(huì)返回它的值
多個(gè)參數(shù)調(diào)用需要是偶數(shù)的參數(shù),每?jī)蓚€(gè)參數(shù)的第一個(gè)是屬性名稱,第二個(gè)是設(shè)置的值
在Windows上的特定屬性如下:
-alpha:窗口的不透明度,值為浮點(diǎn)數(shù),值范圍0.0(完全透明)~1.0(不透明)。如果值超過(guò)范圍則小于0的會(huì)被設(shè)為0.0,大于1的會(huì)被設(shè)為1.0,默認(rèn)值為1.0
-transparentcolor:設(shè)置穿透顏色(透明色),值為顏色,指定空字符串(默認(rèn)值)則不使用
-disabled:窗口是否禁用,值為布爾值,禁用時(shí)無(wú)法在窗口上進(jìn)行任何操作,默認(rèn)值為0
-fullscreen:窗口是否全屏顯示,值為布爾值,默認(rèn)值為0
-toolwindow:窗口是否設(shè)置為工具窗口樣式(窗口標(biāo)題欄只剩關(guān)閉),值為布爾值,默認(rèn)值為0
-topmost:窗口是否頂置,值為布爾值,默認(rèn)值為0
示例:
運(yùn)行結(jié)果:
('-alpha', 1.0, '-transparentcolor', '', '-disabled', 0, '-fullscreen', 0, '-toolwindow', 0, '-topmost', 0)

85.wm_iconify()
# 別名:iconify
將窗口圖標(biāo)化(最小化)
86.wm_deiconify()
# 別名:deiconify
取消窗口圖標(biāo)化,wm_iconify()的逆方法
87.wm_focusmodel(model=None)
# 別名:focusmodel
設(shè)置或獲取焦點(diǎn)模式
'active'為控件將自己索取焦點(diǎn)
'passive'為窗口管理器將給予焦點(diǎn)
默認(rèn)為'passive'。無(wú)參數(shù)調(diào)用返回當(dāng)前焦點(diǎn)模式
88.wm_forget(window)
# 別名:forget
取消窗口window在屏幕上的映射,并wm將不會(huì)管理該窗口
Toplevel窗口不由wm管理時(shí)會(huì)被視為Frame窗口,menu屬性項(xiàng)會(huì)被記住
89.wm_frame()
# 別名:frame
返回窗口的標(biāo)識(shí)符(窗口句柄),是十六進(jìn)制字符串
# 注意要在root.update()后獲取才是目前的窗口句柄
90.wm_geometry(newGeometry=None)
# 別名:geometry
設(shè)置或獲取窗口的geometry string,具體見winfo_geometry()。無(wú)參數(shù)調(diào)用則返回當(dāng)前值
91.wm_iconbitmap(bitmap=None, default=None)
# 別名:iconbitmap
設(shè)置窗口圖標(biāo)為bitmap(.ico文件類型的路徑或其他圖標(biāo)格式)
default——是一個(gè)圖標(biāo)文件路徑,會(huì)將當(dāng)前和后續(xù)所有沒(méi)指定圖標(biāo)的窗口自動(dòng)設(shè)置為此圖標(biāo)文件
# 實(shí)測(cè)default只能指定一次,否則圖標(biāo)將是.exe的圖標(biāo)。如果同時(shí)指定bitmap和default,則只有default生效。指定default之前沒(méi)調(diào)用root.update()且有設(shè)置過(guò)圖標(biāo)會(huì)失效
補(bǔ)充:.ico圖標(biāo)格式??# 摘抄自https://zhuanlan.zhihu.com/p/181586990
.ico是一種圖標(biāo)格式,常見于windows的桌面圖標(biāo)和網(wǎng)址導(dǎo)航欄的小圖標(biāo)。主要特點(diǎn)是一個(gè)ICO文件可以包含多種尺寸圖片
常見的尺寸有16px、24px、32px、48px、64px、96px、128px、192px、256px
win10新增支持更大尺寸512px、768px
需要做全尺寸的推薦256px*256px;不需要的按照使用場(chǎng)景設(shè)計(jì)
補(bǔ)充:標(biāo)準(zhǔn)位圖
對(duì)于bitmap屬性,這些位圖始終可用:

# 圖片來(lái)源:https://tkdocs.com/shipman/bitmaps.html
從左到右依次是:'error', 'gray12', 'gray25', 'gray50', 'gray75', 'hourglass', 'info', 'questhead', 'question', 'warning'
# 不同系統(tǒng)顯示不同
示例:
運(yùn)行結(jié)果:
?




92.wm_iconmask(bitmap=None)
# 別名:iconmask
設(shè)置或獲取位圖掩碼
93.wm_iconname(newName=None)
# 別名:iconname
設(shè)置或獲取當(dāng)窗口圖標(biāo)化時(shí)的圖標(biāo)名稱
94.wm_iconposition(x=None, y=None)
# 別名:iconposition
設(shè)置或獲取當(dāng)窗口圖標(biāo)化時(shí)的圖標(biāo)位置
95.wm_iconwindow(pathName=None)
# 別名:iconwindow
設(shè)置或獲取當(dāng)窗口圖標(biāo)化時(shí)的控件窗口
# pathName是用作圖標(biāo)的窗口,但有的窗口管理器不支持圖標(biāo)窗口概念
96.wm_sizefrom(who=None)
# 別名:sizefrom
設(shè)置或獲取窗口尺寸是由who決定的
who——必須是'user'(用戶)或'program'(系統(tǒng))或它們的縮寫
97.wm_positionfrom(who=None)
# 別名:positionfrom
設(shè)置或獲取窗口位置是由who決定的
who——必須是'user'(用戶)或'program'(系統(tǒng))或它們的縮寫
98.wm_iconphoto(default=False, *args)
# 別名:iconphoto
設(shè)置窗口圖標(biāo),傳入的是PhotoImage類的對(duì)象
default——同wm_iconbitmap()
99.wm_withdraw()
# 別名:withdraw
隱藏窗口,窗口不會(huì)被映射且不在窗口管理器上顯示,可用wm_deiconify()還原
100.wm_state(newstate=None)
# 別名:state
設(shè)置或獲取窗口的狀態(tài):
'normal':正常
'iconic':圖標(biāo)化(最小化)
'withdrawn':被隱藏
'icon':wm_iconwindow()方法中被用作圖標(biāo)
'zoomed':最大化
101.wm_maxsize(width=None, height=None)
# 別名:maxsize
設(shè)置窗口允許被調(diào)整的最大寬度和高度。無(wú)參數(shù)調(diào)用返回當(dāng)前值
102.wm_minsize(width=None, height=None)
# 別名:minsize
設(shè)置窗口允許被調(diào)整的最小寬度和高度。無(wú)參數(shù)調(diào)用返回當(dāng)前值
103.wm_resizable(width=None, height=None)
# 別名:resizable
指示是否可以改變窗口的寬度和高度。值都是布爾值,無(wú)參數(shù)調(diào)用返回當(dāng)前值
104.wm_overrideredirect(boolean=None)
# 別名:overrideredirect
指示窗口管理器是否忽略該窗口,值為布爾值。無(wú)參數(shù)調(diào)用返回當(dāng)前值
# 效果見winfo_containing()的示例
105.wm_title(string=None)
# 別名:title
設(shè)置窗口的標(biāo)題。無(wú)參數(shù)調(diào)用返回當(dāng)前值
106.wm_transient(master=None)
# 別名:transient
指示窗口管理器調(diào)用窗口對(duì)于窗口master是臨時(shí)的。無(wú)參數(shù)調(diào)用返回當(dāng)前值
# 在Windows上的臨時(shí)窗口只有關(guān)閉按鈕
示例:
運(yùn)行結(jié)果:
# 窗口大小進(jìn)行過(guò)手動(dòng)拉伸
?



wm_protocol(ame=None, func=None)
# 別名:protocol
啟動(dòng)協(xié)議處理機(jī)制,name是協(xié)議名,func是回調(diào)函數(shù)
# 如果只傳入?yún)f(xié)議名,則返回協(xié)議名對(duì)應(yīng)的回調(diào)函數(shù)名:[一串?dāng)?shù)字][函數(shù)名]
# 無(wú)參數(shù)調(diào)用返回窗口所有協(xié)議的列表
最常用的協(xié)議是WM_DELETE_WINDOW:當(dāng)用戶點(diǎn)擊窗口的關(guān)閉按鈕時(shí)調(diào)用回調(diào)函數(shù)
# 其他協(xié)議見客戶間通信協(xié)定手冊(cè)(ICCCM)
七、標(biāo)簽控件(Label)
(1)、概念
標(biāo)簽控件主要用來(lái)顯示窗口中的文本或者圖像
(2)、演示圖
# 此部分不給出代碼,用于對(duì)控件有大體認(rèn)識(shí)

(3)、構(gòu)造方法
tkinter.Label(master=None, cnf={}, **kw)
master——指定父控件
cnf——將屬性名稱映射到值的字典
kw——使用關(guān)鍵字設(shè)置屬性
# 后文將不再對(duì)master、cnf和構(gòu)造方法里的kw做解釋
補(bǔ)充:Label控件的背景構(gòu)成 ?# 摘編自C語(yǔ)言中文網(wǎng)
Label控件背景由三部分構(gòu)成內(nèi)容區(qū)、填充區(qū)和邊框,三個(gè)區(qū)域分別可用以下控件屬性控制:
width/height
padx/pady
borderwidth
如下圖所示:

# 圖片來(lái)源:C語(yǔ)言中文網(wǎng)
(4)、屬性項(xiàng)
activebackground, activeforeground, anchor, background, bd, bg, bitmap, borderwidth, compound, cursor, disabledforeground, fg, font, foreground, height, highlightbackground, highlightcolor, highlightthickness, image, justify, padx, pady, relief, state, takefocus, text, textvariable, underline, width, wraplength
1.anchor
文本(或圖像)在Label中(內(nèi)容區(qū))顯示的位置,值必須是'n', 'ne', 'e', 'se', 's', 'sw', 'w', 'nw'或'center'。默認(rèn)值為'center'
2.text
指定顯示在控件上的一行或多行文本,是一個(gè)字符串,使用'\n'換行
3.bitmap
指定顯示在控件上的位圖
# 位圖見“補(bǔ)充:標(biāo)準(zhǔn)位圖”
4.image
指定顯示在控件上的圖像,是一個(gè)圖像對(duì)象(PhotoImage、BitmapImage類的對(duì)象)
# 實(shí)測(cè)如果同時(shí)指定text, bitmap, image,它們的優(yōu)先級(jí)(從高到低)是image, bitmap, text
補(bǔ)充:圖像
下面是兩種在Tkinter中顯示圖像的方式:
1.使用位圖BitmapImage類,需要是.xbm格式,這種方式不過(guò)多介紹
2.使用全彩圖像PhotoImage類,需要是.gif, .pgm, .ppm, .png格式
構(gòu)造方法是:tkinter.PhotoImage(file=文件路徑)
# 注意,如果圖像實(shí)例沒(méi)有(動(dòng)態(tài))賦值給現(xiàn)有變量,圖像將不會(huì)顯示。另外注意函數(shù)中局部變量離開函數(shù)的生命周期后會(huì)被垃圾回收機(jī)制回收,所以建議動(dòng)態(tài)賦值圖像實(shí)例或?qū)⑵浔4鏋槌A?/span>
# 圖像類的方法和具體內(nèi)容見后文章節(jié)“圖像”
5.compound
當(dāng)文本和圖像同時(shí)顯示時(shí),指定圖像位于文本的方位。值可以是'top', 'bottom', 'left', 'right', 'center', 'none'(或它們的縮寫)。默認(rèn)值為'none'
# 實(shí)測(cè)只有值為'center'時(shí)文本才包含在圖像里
示例:
運(yùn)行結(jié)果:

6.state
改變控件的狀態(tài),在不同控件中效果不同,值可以是'normal'(默認(rèn)值), 'active', 'disabled'(或它們的縮寫)
下為L(zhǎng)able控件的實(shí)測(cè):
'active':文本的背景色和前景色變?yōu)閍ctivebackground, activeforeground
'disabled':文本變?yōu)闇\灰色,圖像呈棋盤狀
7.foreground或fg
設(shè)置前景色:如果顯示的是文本,則指定文本的顏色;如果顯示的是位圖,則指定位圖中比特位為1的顏色。默認(rèn)值由系統(tǒng)指定
8.activebackground, activeforeground
設(shè)置當(dāng)控件狀態(tài)為'active'時(shí)顯示的背景色和前景色
9.disabledforeground
設(shè)置當(dāng)控件狀態(tài)為'disabled'時(shí)顯示的前景色
10.font
指定文本的字體
補(bǔ)充:字體
下面是兩種在Tkinter中設(shè)置字體的方式:
一、使用字符串或元組:(字體, 大小, 樣式, 樣式, ...)
# 使用字符串相當(dāng)于''.join(元組)
大小——如果是正數(shù),則以點(diǎn)數(shù)為單位;如果是負(fù)數(shù),則以像素為單位
樣式——是一個(gè)字符串,可包含一個(gè)或多個(gè)樣式(用空格分隔),樣式分別是:
字體粗細(xì)(二選一):'normal'(普通,默認(rèn)值), 'bold'(加粗)
字體斜度(二選一):'roman'(羅馬,默認(rèn)值), 'italic'(傾斜)
其他樣式:'underline'(下劃線), 'overstrike'(刪除線)
二、使用tkinter.font模塊
使用其中的Font類創(chuàng)建字體對(duì)象:
Font(root=None, font=None, name=None, exists=False, **options)
root——主窗口
font——指定字體,使用方法同1
name——字體對(duì)象的名稱,默認(rèn)值是'fontN',N是第幾個(gè)字體對(duì)象,名稱唯一
exists——name指定的字體對(duì)象名稱是否已經(jīng)存在。如果為False,則在name指定的字體對(duì)象名稱不存在時(shí)創(chuàng)建一個(gè)新的字體對(duì)象,否則拋出TclError;如果為True,則在name指定的字體對(duì)象名稱存在時(shí)指向現(xiàn)有的字體對(duì)象,否則拋出TclError
options——屬性項(xiàng),如果font被指定了則會(huì)被忽略,下面是屬性項(xiàng):
family:字體
size:大小,單位是點(diǎn)數(shù)
weight:字體粗細(xì),'normal', 'bold'
slant:字體斜度,'roman', 'italic'
underline:下劃線,布爾值
overstrike:刪除線,布爾值
# 實(shí)測(cè)默認(rèn)值為:{'family': '宋體', 'size': 12, 'weight': 'normal', 'slant': 'roman', 'underline': 0, 'overstrike': 0},不同環(huán)境上的默認(rèn)值應(yīng)該不同
# 文本控件不設(shè)置font屬性的默認(rèn)值為'TkDefaultFont',具體見后
下面是Font類的方法:
1.actual(option=None, displayof=None)
返回字體對(duì)象的實(shí)際屬性項(xiàng)值
option——屬性項(xiàng)名,未給出則返回所有屬性與實(shí)際值組成的字典。否則返回給定屬性項(xiàng)的值
displayof——指定顯示器
2.cget(option)
返回字體對(duì)象option屬性項(xiàng)的值
# 這里的值是傳入值而不是實(shí)際值
3.config(**options)
# 別名configure
修改字體對(duì)象的屬性項(xiàng)值
4.copy()
返回字體對(duì)象的獨(dú)立副本
# 這是將字體對(duì)象的實(shí)際屬性項(xiàng)值傳入構(gòu)造方法得到的
5.measure(text, displayof=None)
返回將字體應(yīng)用到text后的寬度,單位是像素
displayof——指定顯示器
6.metrics(*options, **kw)
返回字體對(duì)象的font metrics(字體規(guī)格/字體度量)
# 關(guān)于font metrics,請(qǐng)查閱網(wǎng)絡(luò)
下面是tkinter.font模塊的常量:
NORMAL, ROMAN, BOLD, ITALIC
下面是tkinter.font模塊的函數(shù):
1.families(root=None, displayof=None)
以元組形式返回所有支持的字體
2.nametofont(name)
返回名為name的Font實(shí)例
# 在Python 3.10版添加了root形參:nametofont(name, root=None)
3.names(root=None)
以元組形式返回所有定義的字體
示例:
運(yùn)行結(jié)果:
{'family': '微軟雅黑', 'size': 15, 'weight': 'bold', 'slant': 'roman', 'underline': 1, 'overstrike': 0}
122
{'ascent': 21, 'descent': 6, 'linespace': 27, 'fixed': 0}
?
補(bǔ)充:標(biāo)準(zhǔn)字體
TkDefaultFont:所有GUI項(xiàng)目的默認(rèn)字體
TkTextFont:用于Enter、Listbox等控件
TkFixedFont:一種標(biāo)準(zhǔn)的固定寬度的字體
TkMenuFont:用于菜單項(xiàng)的字體
TkHeadingFont:用于列表和表格標(biāo)題的字體
TkCaptionFont:用于窗口和對(duì)話框標(biāo)題欄的字體
TkSmallCaptionFont:用于子窗口或工具對(duì)話框的字體
TkIconFont:用于圖標(biāo)標(biāo)題(icon captions)的字體
TkTooltipFont:用于工具提示(移動(dòng)到控件之上顯示控件功能)的字體
# 標(biāo)準(zhǔn)字體具體屬性項(xiàng)值可使用nametofont()獲取對(duì)應(yīng)Font實(shí)例
11.justify
指定多行文本的對(duì)齊方式。值為'left', 'center'(默認(rèn)值), 'right'(或它們的縮寫)
12.padx, pady
指定控件左右兩邊提供的額外空間(控件邊框與內(nèi)容的間距),分別是水平和垂直,默認(rèn)值都為1,單位是像素
此屬性與布局方法中padx, pady屬性的區(qū)別是控件屬性padx, pady指定的是內(nèi)邊距。此屬性與布局方法中ipadx, ipady屬性的區(qū)別是,有些控件(例如框架控件Frame)如果其中沒(méi)有內(nèi)容或顯示的是位圖或圖像時(shí),控件屬性padx, pady會(huì)省略而布局方法ipadx, ipady不會(huì)省略
13.textvariable
值為一個(gè)StringVar類的控制變量,設(shè)置后控件顯示的文本是這個(gè)控制變量的值
# 關(guān)于控制變量參見下一章
14.underline
給指定的字符添加下劃線,默認(rèn)值-1表示不添加,值為整數(shù),從0開始
# 實(shí)測(cè)如果文本(文本大小足夠大)已有下劃線,再用這個(gè)加下劃線會(huì)使指定字符的下劃線加粗
15.wraplength
指定每行的字符數(shù),單位是像素。默認(rèn)值為0,意味著只有在'\n'時(shí)才換行
# 默認(rèn)值不為0時(shí)在'\n'時(shí)也會(huì)換行
示例:
運(yùn)行結(jié)果:

示例2:
# 控件屬性padx, pady和布局屬性padx, pady, ipadx, ipady的區(qū)別
使用的圖片:
green.png:

程序:
運(yùn)行結(jié)果:

# 最左邊標(biāo)簽控件因?yàn)槭菆D片,省略額外空間padx, pady
# 中間控件和最右邊控件分別用布局屬性設(shè)置外邊距和內(nèi)邊距
(5)、屬性項(xiàng)的默認(rèn)值及注意事項(xiàng)
background, bg:默認(rèn)值由系統(tǒng)指定
borderwidth, bd:默認(rèn)值為2
cursor:默認(rèn)值為空字符串 ?# 空字符串代表系統(tǒng)默認(rèn)或沒(méi)指定
width, height:字符為單位,默認(rèn)值都為0(根據(jù)文本大小自動(dòng)選擇適合的大?。?/span>
# 注意如果Label是圖像則以像素為單位
relief:默認(rèn)值為'flat'
八、控制變量/動(dòng)態(tài)類型(Control variables)
# 此章參考:
https://tkdocs.com/shipman/control-variables.html
http://c.biancheng.net/tkinter/entry-widget.html
(1)、概念
GUI編程中,有時(shí)需要“動(dòng)態(tài)跟蹤”一些變量值的變換,從而保證值的變換及時(shí)地反映到顯示界面上,但Python內(nèi)置的數(shù)據(jù)類型無(wú)法做到這一目的,就需要使用Tcl內(nèi)置的對(duì)象——控制變量(動(dòng)態(tài)類型/Tcl變量)
?
控制變量的一個(gè)特殊性質(zhì)就是可以被不同的控件共享且記住所有共享它的控件
(2)、創(chuàng)建
# 下面三個(gè)都是繼承自Variable類
字符串控制變量:
StringVar(master=None, value=None, name=None)
整數(shù)控制變量:
IntVar(master=None, value=None, name=None)
浮點(diǎn)數(shù)控制變量:
DoubleVar(master=None, value=None, name=None)
布爾值控制變量:
BooleanVar(master=None, value=None, name=None)
master——指定父控件
value——指定值,默認(rèn)值分別為'', 0, 0.0, False
name——指定名稱,默認(rèn)值為PY_VARnum(num是第幾個(gè)控制變量)。如果name和現(xiàn)有的控制變量重名,則會(huì)覆蓋原有的控制變量
(3)、方法
# 以下“變量”指“控制變量”
# 'trace_v...()'的方法和trace()方法是被廢棄的
1.get()
返回變量的當(dāng)前值
2.set(value)
# 別名:initialize
改變變量的當(dāng)前值value。共享此變量的控件會(huì)在主循環(huán)下次空閑時(shí)被更新
補(bǔ)充:使用主窗口的getvar()和setvar()方法也可以獲取或改變變量的值
3.trace_add(mode, callback)
為變量綁定一個(gè)回調(diào)函數(shù),檢測(cè)到mode操作時(shí)調(diào)用回調(diào)函數(shù)
mode——值為'read'(讀?。? 'write'(寫入), 'unset'(刪除),或者是包含它們的列表、元組和字符串
callback——回調(diào)函數(shù)。被回調(diào)時(shí)會(huì)被傳遞三個(gè)參數(shù):(變量名/數(shù)組名稱, 數(shù)組索引, 操作)
# 實(shí)際上mode的值還有'array',這里不詳細(xì)說(shuō)明
返回值是回調(diào)函數(shù)的名稱:[一串?dāng)?shù)字][函數(shù)名]
4.trace_remove(mode, cbname)
刪除變量的一個(gè)回調(diào)函數(shù)
mode——必須與trace_add()中指定的值相同
abname——trace_add()中返回的回調(diào)函數(shù)的名稱
5.trace_info()
返回當(dāng)前設(shè)置在變量上的所有回調(diào)函數(shù)的信息:
[((模式, 模式, ...), 回調(diào)函數(shù)名稱), ((模式, 模式, ...), 回調(diào)函數(shù)名稱), ...]
示例:
運(yùn)行結(jié)果:
[(('read', 'write'), '1913088callback')]
width被讀取
height被讀取
width被寫入
...
輸入前:

輸入后:

九、框架控件(Frame)
(1)、概念
框架控件是一個(gè)矩形窗體,是其他控件的一個(gè)容器,有助于組織用戶界面
每個(gè)框架控件都有自己的布局(pack, grid或place),之間互不干擾
# 實(shí)際上根窗口基本上就是一個(gè)框架
(2)、演示圖

(3)、構(gòu)造方法
tkinter.Frame(master=None, cnf={}, **kw)
(4)、屬性項(xiàng)
bd, borderwidth, class, relief, background, bg, colormap, container, cursor, height, highlightbackground, highlightcolor, highlightthickness, padx, pady, takefocus, visual, width
# container屬性項(xiàng)見頂級(jí)窗口控件
補(bǔ)充:使用布局管理器的in(in_)屬性使其他控件放置在框架容器中
(5)、屬性項(xiàng)的默認(rèn)值及注意事項(xiàng)
borderwidth, bd:默認(rèn)值都為0
relief:默認(rèn)值為'flat'
background, bg:默認(rèn)值由系統(tǒng)指定
cursor:默認(rèn)值為空字符串
width, height:默認(rèn)值都為0
highlightthickness:默認(rèn)值為0
highlightcolor, highlightbackground:默認(rèn)值由系統(tǒng)指定
# 注意因?yàn)閠akefocus的默認(rèn)值為0,控件不能獲得焦點(diǎn)。所以只有當(dāng)takefocus為1時(shí),highlightcolor和highlightbackground才起作用
padx, pady:默認(rèn)值都為0
takefocus:默認(rèn)值為0
示例:
運(yùn)行結(jié)果:

# pack默認(rèn)居中,grid默認(rèn)左上(0, 0)
十、標(biāo)簽框架控件(LabelFrame)
(1)、概念
屬于框架控件的變體,與框架控件不同的是會(huì)在包裹的子控件周圍繪制一個(gè)邊框和一個(gè)標(biāo)簽
當(dāng)想要將一些相關(guān)的控件分為一組時(shí)可以使用此控件
(2)、演示圖

(3)、構(gòu)造方法
tkinter.LabelFrame(master=None, cnf={}, **kw)
(4)、屬性項(xiàng)
bd, borderwidth, class, fg, font, foreground, labelanchor, labelwidget, relief, text, background, bg, colormap, container, cursor, height, highlightbackground, highlightcolor, highlightthickness, padx, pady, takefocus, visual, width
1.labelanchor
指定控件邊框上標(biāo)簽的位置,默認(rèn)位置為'nw'(頂部的左端)
可選值有:'e', 'en', 'es', 'n', 'ne', 'nw', 's', 'se', 'sw', 'w', 'wn'或'ws'
具體位置請(qǐng)見下圖:

# 注意'nw'與'wn'的位置不同,其他值同樣
2.labelwidget
使用另一個(gè)控件代替標(biāo)簽
如果同時(shí)傳入labelwidget和text屬性,則text的值將被忽略
(5)、屬性項(xiàng)的默認(rèn)值及注意事項(xiàng)
borderwidth, bd:默認(rèn)值為2
foreground, fg:默認(rèn)值由系統(tǒng)指定
# 前景色和后面的字體等都是對(duì)邊框周圍的標(biāo)簽作用的
font:默認(rèn)值為'TkDefaultFont'
relief:默認(rèn)值為'groove'
text:默認(rèn)值為空字符串
background, bg:默認(rèn)值由系統(tǒng)指定
container:默認(rèn)值為0
cursor:默認(rèn)值為空字符串
width, height:默認(rèn)值都為0
highlightthickness:默認(rèn)值為0
highlightcolor, highlightbackground:默認(rèn)值由系統(tǒng)指定
padx, pady:默認(rèn)值都為0
takefocus:默認(rèn)值為0
示例:
運(yùn)行結(jié)果:
