Python的GUI編程之Pack、Place、Grid的區(qū)別說(shuō)明
GUI編程之 Pack、Place、Grid的區(qū)別
本文講述如何使用 tkinter 的布局管理 (被稱作 layout managers 或 geometry managers). tkinter 有三種布局管理方式:
packgridplace
注意這三種布局管理在同一個(gè) master window 里一定不可以混用! 布局管理有以下功能:
- 將控件放置在屏幕上,包括控件的位置及控件的大小
- 將控件注冊(cè)到本地窗口系統(tǒng)中
- 管理控件在屏幕上的顯示
雖然控件自己也可以指定大小和對(duì)齊方式等信息, 但最終的控件大小及位置還是由布局管理決定的.
Pack 布局管理
pack 是三種布局管理中最常用的. 另外兩種布局需要精確指定控件具體的顯示位置, 而 pack 布局可以指定相對(duì)位置, 精確的位置會(huì)由 pack 系統(tǒng)自動(dòng)完成. 這也使得 pack 布局沒有另外兩種布局方式靈活. 所以 pack 是
簡(jiǎn)單應(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)來(lái)維護(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)過先前的打包要求,空間縮小,后來(lái)的打包要求只能獲得縮小后剩余空間的一條邊。
- 組件都分配空間后,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如何向SQLServer存儲(chǔ)二進(jìn)制圖片
這篇文章主要介紹了Python如何向SQLServer存儲(chǔ)二進(jìn)制圖片,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
利用python下載scihub成文獻(xiàn)為PDF操作
這篇文章主要介紹了利用python下載scihub成文獻(xiàn)為PDF操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-07-07
python使用梯度下降算法實(shí)現(xiàn)一個(gè)多線性回歸
這篇文章主要為大家詳細(xì)介紹了python使用梯度下降算法實(shí)現(xiàn)一個(gè)多線性回歸,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03
如何用python實(shí)現(xiàn)一個(gè)HTTP連接池
這篇文章主要介紹了如何用python實(shí)現(xiàn)一個(gè)HTTP連接池的步驟,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2021-01-01
Django框架orM與自定義SQL語(yǔ)句混合事務(wù)控制操作
這篇文章主要介紹了Django框架orM與自定義SQL語(yǔ)句混合事務(wù)控制操作,結(jié)合實(shí)例形式分析了同一個(gè)方法里面既有ORM又有自定義SQL 語(yǔ)句的情況下事務(wù)控制相關(guān)操作技巧,需要的朋友可以參考下2019-06-06
Python 編碼處理-str與Unicode的區(qū)別
本文主要介紹Python 編碼處理的問題,這里整理了相關(guān)資料,并詳細(xì)說(shuō)明如何處理編碼問題,有需要的小伙伴可以參考下2016-09-09

