Python的GUI編程之Pack、Place、Grid的區(qū)別說明
GUI編程之 Pack、Place、Grid的區(qū)別
本文講述如何使用 tkinter 的布局管理 (被稱作 layout managers 或 geometry managers). tkinter 有三種布局管理方式:
pack
grid
place
注意這三種布局管理在同一個(gè) master window 里一定不可以混用! 布局管理有以下功能:
- 將控件放置在屏幕上,包括控件的位置及控件的大小
- 將控件注冊(cè)到本地窗口系統(tǒng)中
- 管理控件在屏幕上的顯示
雖然控件自己也可以指定大小和對(duì)齊方式等信息, 但最終的控件大小及位置還是由布局管理決定的.
Pack 布局管理
pack 是三種布局管理中最常用的. 另外兩種布局需要精確指定控件具體的顯示位置, 而 pack 布局可以指定相對(duì)位置, 精確的位置會(huì)由 pack 系統(tǒng)自動(dòng)完成. 這也使得 pack 布局沒有另外兩種布局方式靈活. 所以 pack 是
簡單應(yīng)用的首選布局
fill 控件填充方式
設(shè)置組件之間的間隙大小
ipadx
,ipady
設(shè)置內(nèi)部間隙padx
,pady
設(shè)置外部間隙side
順次放置控件
Place 布局管理
Place 布局管理可以顯式的指定控件的絕對(duì)位置或相對(duì)于其他控件的位置. 要使用 Place 布局, 調(diào)用相應(yīng)控件的 place() 方法就可以了. 所有 tkinter 的標(biāo)準(zhǔn)控件都可以調(diào)用 place()方法.
下面是一個(gè)使用 Place 布局的例子: 為 Label 控件設(shè)置隨機(jī)的背景色, 然后計(jì)算各個(gè) Label 的背景色的亮度(灰度值), 如果其亮度小于 120, 則將其前景色(文字顏色, fg屬性)設(shè)置為白色, 否則設(shè)為黑色. 這樣做是為了避免使背景色和前景色過于接近而導(dǎo)致文字不易閱讀
Grid 布局管理
Pack 作為首選的布局管理方式,其運(yùn)作方式并不是特別易于理解. 已經(jīng)由 Pack 布局完成的設(shè)計(jì)也很難做出改變. Grid 布局在1996年作為另一種可供選擇的布局方式被引入. Grid 布局方式易學(xué)易用, 但似乎大家還是習(xí)慣用 Pack.
Grid 在很多場(chǎng)景下是最好用的布局方式.相比而言, Pack 布局在控制細(xì)節(jié)方面有些力不從心. Place 布局雖然可以完全控制控件位置, 但這也導(dǎo)致使用 Place 會(huì)比其他兩種布局方式更加復(fù)雜.
Grid 把控件位置作為一個(gè)二維表結(jié)構(gòu)來維護(hù),即按照行列的方式排列控件: 控件位置由其所在的行號(hào)和列號(hào)決定. 行號(hào)相同而列號(hào)不同的幾個(gè)控件會(huì)被彼此上下排列; 列號(hào)相同而行號(hào)不同的幾個(gè)控件會(huì)被彼此左右排列.
使用 Grid 布局的過程就是為各個(gè)控件指定行號(hào)和列號(hào)的過程. 不需要為每個(gè)格子指定大小, Grid 布局會(huì)自動(dòng)設(shè)置一個(gè)合適的大小.
GUI中關(guān)于打包幾何管理器(Pack)的一些細(xì)節(jié)
先談?wù)刾acker布局系統(tǒng)的工作原理
pack打包的步驟如下:
- packer最初開始時(shí),擁有整個(gè)父組件容器的可用空間(如整個(gè)框架或頂層窗口的空間)
- 隨著組件在某一條邊上被打包,該組件獲得了剩余空間中要求的一條邊,剩余空間縮小(默認(rèn)為頂部那條邊,即TOP)。
- 經(jīng)過先前的打包要求,空間縮小,后來的打包要求只能獲得縮小后剩余空間的一條邊。
- 組件都分配空間后,expand選項(xiàng)劃分所有的剩余空間,fill選項(xiàng)和anchor選項(xiàng)在組件分配的空間內(nèi)拉伸調(diào)整組件
由此可見,pack選項(xiàng)執(zhí)行的順序?yàn)閟ide>expand>fill/anchor。
fill與anchor選項(xiàng)必須在組件分配到所在空間,完成打包順序,expand要求后才可使用。
打包順序?qū)?duì)剪切結(jié)果產(chǎn)生影響
打包過程中,pack的順序很重要。注意其中因?yàn)楦复翱诳s小而產(chǎn)生的裁切問題:先打包的最后被裁切。(從技術(shù)上講,窗口尺寸改變后優(yōu)惠執(zhí)行打包步驟。這意味著,在窗口縮小時(shí),將沒有足夠的空間留給最后打包的組件,看上去就像最先打包的組件最后被裁切掉)
觀察以下兩個(gè)代碼因窗口縮小時(shí)產(chǎn)生的不同效果:
#我們只關(guān)注裁切問題 from tkinter import * def greeting(): print('Hello stdout world!...') win = Frame() win.pack(expand=YES,fill=BOTH) Button(win, text='Hello', command=greeting).pack() Label(win, text='Hello container world').pack(side=TOP)#side選項(xiàng)使該標(biāo)簽位于頂部 win.mainloop()
可以看到窗口縮小時(shí)由于裁切問題而產(chǎn)生結(jié)果是這樣的,明顯是label先被擠出去,因?yàn)閘abel標(biāo)簽后被打包
from tkinter import * def greeting(): print('Hello stdout world!...') win = Frame() win.pack(expand=YES,fill=BOTH) Label(win, text='Hello container world').pack(side=TOP)#side選項(xiàng)使該標(biāo)簽位于頂部 Button(win, text='Hello', command=greeting).pack() win.mainloop()
可以看到窗口縮小時(shí)由于裁切問題而產(chǎn)生結(jié)果是這樣的,因?yàn)锽utton標(biāo)簽后被打包。
***因此:打包順序?qū)?duì)剪切結(jié)果產(chǎn)生影響***
打包幾何管理器的各個(gè)選項(xiàng)細(xì)節(jié)
side
:決定獲得剩余空間的某一側(cè)(可選LEFT,RIGHT,TOP,BOTTOM),默認(rèn)為TOP;expand
:拓沖分配所得空間(可選NO,YES),默認(rèn)為NO;fill
:填充分配所得空間(可選Y,X,BOTH),默認(rèn)為None;anchor
:定位組件在分配所得空間中的位置(默認(rèn)為CENTER;可選N,S,W,E,NW,NE,SW,SE),默認(rèn)為CENTER。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python中使用pymssql庫操作MSSQL數(shù)據(jù)庫
這篇文章主要給大家介紹了關(guān)于python中使用pymssql庫操作MSSQL數(shù)據(jù)庫的相關(guān)資料,最近在學(xué)習(xí)python,發(fā)現(xiàn)好像沒有對(duì)pymssql的詳細(xì)說明,于是乎把官方文檔學(xué)習(xí)一遍,重要部分做個(gè)歸檔,方便以后查閱,需要的朋友可以參考下2023-08-08Python基于scapy實(shí)現(xiàn)修改IP發(fā)送請(qǐng)求的方法示例
這篇文章主要介紹了Python基于scapy實(shí)現(xiàn)修改IP發(fā)送請(qǐng)求的方法,涉及Python網(wǎng)絡(luò)編程中使用scapy操作IP的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-07-07卡爾曼濾波數(shù)據(jù)處理技巧通俗理解及python實(shí)現(xiàn)
這篇文章主要為大家介紹了卡爾曼濾波數(shù)據(jù)處理技巧的通俗理解及python實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05Python?OpenCV實(shí)現(xiàn)3種濾鏡效果實(shí)例
opencv是一個(gè)很強(qiáng)大的庫,支持多個(gè)編程語言,下面這篇文章主要給大家介紹了關(guān)于Python?OpenCV實(shí)現(xiàn)3種濾鏡效果的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04python 獲取計(jì)算機(jī)的網(wǎng)卡信息
這篇文章主要介紹了python 獲取計(jì)算機(jī)的網(wǎng)卡信息的方法,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下2021-02-02python雙向鏈表原理與實(shí)現(xiàn)方法詳解
這篇文章主要介紹了python雙向鏈表原理與實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了Python雙向鏈表的定義、以及節(jié)點(diǎn)的判斷、遍歷、添加、刪除等相關(guān)操作技巧,需要的朋友可以參考下2019-12-12在Windows服務(wù)器下用Apache和mod_wsgi配置Python應(yīng)用的教程
這篇文章主要介紹了在Windows服務(wù)器下用Apache和mod_wsgi配置Python應(yīng)用的教程,本文選擇以flask框架作為示例,需要的朋友可以參考下2015-05-05Python?pomegranate庫實(shí)現(xiàn)基于貝葉斯網(wǎng)絡(luò)拼寫檢查器
這篇文章主要為大家介紹了Python?pomegranate庫實(shí)現(xiàn)基于貝葉斯網(wǎng)絡(luò)拼寫檢查器示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>2023-04-04