python之pack布局


#Pack為一布局管理器,可將它視為一個彈性的容器
'''1.一個空的widget'''
#不使用pack
# -*- coding: cp936 -*-
from Tkinter imp

ort *
root = Tk()
# 查看當前root下的子組件,解釋器沒有報異常,說明Pack已創建,並可以使用,此時的輸出為空,即root沒有任何子組件。
print root.pack_slaves()
# 向root中pack一個Label
Label(root,text = 'pack').pack()
# 再次打印出root的子組件,可以看到已經包含一個組件,即剛才創建的Label,說明Label調用pack()是將自己加入到了root中。print root.pack_slaves()
root.mainloop()
# pack_salves打印當前組件包擁有的子組件,通過這個函數可以查看各個組件是否有包含關系。 比如[<Tkinter.Label instance at 0x0143F378>]這個結果

'''2.root與Pack的關系'''
# -*- coding: cp936 -*-
# 使用文字create_text
from Tkinter import *
root = Tk()
# 改變root的大小為80x80
root.geometry('80x80+0+0') 

#80x80代表了初始化時主窗口的大小,0,0代表了初始化時窗口所在的位置
print root.pack_slaves()
Label(root,text = 'pack').pack()
print root.pack_slaves()
root.mainloop()

#可以看出Pack的結果沒有什么變化,它不對root產生影響,也就是說Pack可以“縮小”至只包含一個Label組件,root可以自己控件自己的大小。
'''3.向Pack中添加多個組件'''
# -*- coding: cp936 -*-
# 向Pack中添加多個Label
from Tkinter import *
root = Tk()
# 改變root的大小為80x80
root.geometry('80x80+0+0')
print root.pack_slaves()
for i in range(5):
 

  Label(root,text = 'pack' + str(i)).pack()
print root.pack_slaves()
root.mainloop()
# 使用用默認的設置pack將向下添加組件,第一個在最上方,然后是依次向下排列。注意最后一個Label的顯示不完全,原因是我們設定了主窗口大小80x80太小,如果我們改大點,120x120就沒問題了。
'''4.固定設置到自由變化'''
# 上例中看到label4沒有顯示完全
# -*- coding: cp936 -*-
# 不設置root的大小,使用默認
from Tkinter import *
root = Tk()
#去掉下面的這句
#root.geometry('80x80+0+0')
print root.pack_slaves()
for i in range(5):
    Label(root,text = 'pack' + str(i)).pack()

print root.pack_slaves()
root.mainloop()

print 的結果顯示一下:[<Tkinter.Label instance at 0x012DE9E0>, <Tkinter.Label instance at 0x012DE990>, <Tkinter.Label instance at 0x012DEA80>, <Tkinter.Label instance at 0x012E5828>, <Tkinter.Label instance at 0x012E5878>]

#使用用默認的設置pack將向下添加組件,第一個在最上方,然后是依次向下排列。這樣的話最后一個已經顯示出來的,這就是為什么稱Pack為彈性的容器的原因了,雖然有這個特性,但它並不是總是能夠按照我們的意思進行布局,我們可以強制設置容器的大小,以覆蓋Pack的默認設置。Pack的優先級低。
'''5.fill如何控制子組件的布局'''
# -*- coding: cp936 -*-
# 不設置root的大小,使用默認
from Tkinter import *
root = Tk()
# 改變root的大小為150x150
root.geometry('150x150+0+0')
print root.pack_slaves()
# 創建三個Label分別使用不同的fill屬性
Label(root,text = 'pack1',bg = 'red').pack(fill = “y”)
Label(root,text = 'pack2',bg = 'blue').pack(fill = “both”)
Label(root,text = 'pack3',bg = 'green').pack(fill = “x”)
print root.pack_slaves()
root.mainloop()
#第一個只保證在Y方向填充,第二個保證在XY兩個方向上填充,第三個不使用填充屬性,注意Pack只會吝嗇地給出可以容納這三個組件的最小區域,它不允許使用剩余的空間了,故下方留有“空白”。

結果截圖:

Python學習筆記鈥斺擳kinter <wbr>GUI編程鈥斺攑ack
'''6.expand如何控制組件的布局'''
# -*- coding: cp936 -*-
# 這個屬性指定如何使用額外的空間,即上例中留下來的“空白”
from Tkinter import *
root = Tk()
# 改變root的大小為150x150
root.geometry('150x150+0+0')
print root.pack_slaves()
# 創建三個Label分別使用不同的fill屬性
Label(root,text = 'pack1',bg = 'red').pack(fill = "y",expand = 1)
Label(root,text = 'pack2',bg = 'blue').pack(fill = "both",expand = 1)
Label(root,text = 'pack3',bg = 'green').pack(fill = "x",expand = 0)
print root.pack_slaves()
root.mainloop()
# 第一個只保證在Y方向填充,第二個保證在XY兩個方向上填充,第三個不使用填充屬性,這個例子中第一個Label和第二個Label使用了expand = 1屬性,而第三個使用expand = 0屬性,改變root的大小,可以看到Label1和Label2是隨着root的大小變化而變化(嚴格地它的可用空間在變化),第三個只中使用fill 進行X方向上的填充,不使用額外的空間。

看結果截圖:

Python學習筆記鈥斺擳kinter <wbr>GUI編程鈥斺攑ack 

可以看到是怎么利用剩余空間的
'''7.改變組件的排放位置'''
# 使用side屬性改變放置位置
# -*- coding: cp936 -*-
from Tkinter import *
root = Tk()
# 改變root的大小為150x150
root.geometry('150x150+0+0')
print root.pack_slaves()
# 創建三個Label分別使用不同的fill屬性,改為水平放置
# 將第一個Label居左放置
Label(root,text = 'pack1',bg = 'red').pack(fill = "y",expand = 1,side = "left")
# 將第二個Label居右放置
Label(root,text = 'pack2',bg = 'blue').pack(fill = "both",expand = 1,side = "right")
# 將第三個Label居左放置,靠Label放置,注意它不會放到Label1的左邊
Label(root,text = 'pack3',bg = 'green').pack(fill = "x",expand = 0,side = "left")
print root.pack_slaves()
root.mainloop()

# 第一個只保證在Y方向填充,第二個保證在XY兩個方向上填充,第三個不使用填充屬性,這個例子中第一個Label和第二個Label使用了expand = 1屬性,而第三個使用expand = 0屬性,改變root的大小,可以看到Label1和Label2是隨着root的大小變化而變化(嚴格地它的可用空間在變化),第三個只中使用fill 進行X方向上的填充,不使用額外的空間。

看截圖第一個是原始150x150的大小,第二是變大了后的情況

Python學習筆記鈥斺擳kinter <wbr>GUI編程鈥斺攑ack

Python學習筆記鈥斺擳kinter <wbr>GUI編程鈥斺攑ack
'''8.設置組件之間的間隙大小'''
# ipadx設置內部間隙
# padx設置外部間隙
# -*- coding: cp936 -*-
# 不設置root的大小,使用默認
from Tkinter import *
root = Tk()
# 改變root的大小為200x150
# root.geometry('200x150+0+0')
print root.pack_slaves()
# 創建三個Label分別使用不同的fill屬性,改為水平放置
# 將第一個LabelFrame居左放置
L1 = LabelFrame(root,text = 'pack1',bg = 'red')
# 設置ipadx屬性為20
L1.pack(side = LEFT,ipadx = 20)
Label(L1,
 

    text = 'inside',
      bg = 'blue'
      ).pack(expand = 1,side = LEFT)
L2 = Label(root,
           text = 'pack2',
           bg = 'blue'
           ).pack(fill = BOTH,expand = 1,side = LEFT,padx = 10)
L3 = Label(root,
           text = 'pack3',
           bg = 'green'
           ).pack(fill = X,expand = 0,side = LEFT,pady = 10)
print root.pack_slaves()

root.mainloop()
#為了演示ipadx/padx,創建了一個LabelFrame設置它的ipadx為20,即內部間隔值為20,它的子組件若使用則會留出20個單位;Label2和Label3分別設置x和y方向上的外部間隔值,所有與之排列的組件會與之保留10個單位值的距離


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM