欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python的GUI編程之Pack、Place、Grid的區(qū)別說明

 更新時(shí)間:2022年06月20日 15:21:43   作者:weixin_39076347  
這篇文章主要介紹了Python的GUI編程之Pack、Place、Grid的區(qū)別說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

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é)果是這樣的

可以看到窗口縮小時(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)文章

最新評(píng)論