1. 程式人生 > >Python Tkinter Grid佈局管理器入門

Python Tkinter Grid佈局管理器入門

Grid(網格)佈局管理器會將控制元件放置到一個二維的表格裡。主控制元件被分割成一系列的行和列,表格中的每個單元(cell)都可以放置一個控制元件。

什麼時候使用Grid管理器

grid管理器是Tkinter裡面最靈活的幾何管理佈局器。如果你不確定什麼情況下從三種佈局管理中選擇,你至少要保證自己會使用grid。
當你設計對話方塊的時候,grid佈局管理器是一個非常方便的工具。如果你之前使用pack進行佈局的話,你會被使用grid後的簡潔而震驚。與適應很多frame來讓pack工作不同,在大多數情況下,你只需要將所有控制元件放置到容器中,然後使用grid將它們佈局到任何你想要佈局的地方。

參考下面這個例子:


使用pack進行佈局的話,你不得不使用一些額外的frame控制元件,而且還需要花費一些功夫讓他們變得好看。如果你使用grid的話,你只需要對每個控制元件使用grid,所有的東西都會以合適的方式顯示。

注意:不要試圖在一個主視窗中混合使用pack和grid。


使用grid進行佈局管理非常容易。只需要建立控制元件,然後使用grid方法去告訴佈局管理器在合適的行和列去顯示它們。你不用事先指定每個網格的大小,佈局管理器會自動根據裡面的控制元件進行調節。

from Tkinter import *

master = Tk()
Label(master, text="First").grid(row=0)
Label(master, text="Second").grid(row=1)


e1 = Entry(master)
e2 = Entry(master)


e1.grid(row=0, column=1)
e2.grid(row=1, column=1)

mainloop()

執行如下圖所示:


label1佔據0行0列,label2佔據1行0列,entry1佔據0行1列,entry2佔據1行1列。

注意:1.在使用grid方法時,如果不指定column引數,則預設從0開始。

2.沒有被使用的行和列號將被忽略,在上面的例子中如果使用10行和20行,則執行效果是一樣的。

使用sticky引數

預設的空間會在網格中居中顯示。你可以使用sticky選項去指定對齊方式,可以選擇的值有:N/S/E/W,分別代表上/下/左/右。如果你想讓label靠左顯示,你可以設定stricky的值為W。

from Tkinter import *

master = Tk()
Label(master, text="First").grid(row=0, sticky=W)
Label(master, text="Second").grid(row=1, sticky=w)


e1 = Entry(master)
e2 = Entry(master)


e1.grid(row=0, column=1)
e2.grid(row=1, column=1)

mainloop()

執行效果如下圖:


你同樣可以指定控制元件跨越一個或者多個網格。columnspan選項可以指定控制元件跨越多列顯示,而rowspan選項同樣可以指定控制元件跨越多行顯示。

下面的程式碼建立了我們最初演示的示意圖:

from Tkinter import *

master = Tk()
var = IntVar()

Label(master, text="First").grid(sticky=E)
Label(master, text="Second").grid(sticky=E)

e1 = Entry(master)
e2 = Entry(master)

e1.grid(row=0, column=1)
e2.grid(row=1, column=1)

checkbutton = Checkbutton(master, text='Preserve aspect', variable=var)
checkbutton.grid(columnspan=2, sticky=W)

photo = PhotoImage(file='2qq.gif')
label = Label(image=photo)
label.image = photo
label.grid(row=0, column=2, columnspan=2, rowspan=2, sticky=W+E+N+S, padx=5, pady=5)

button1 = Button(master, text='Zoom in')
button1.grid(row=2, column=2)

button2 = Button(master, text='Zoom out')
button2.grid(row=2, column=3)

mainloop()

執行效果如下圖:


在這段程式碼中,有一些細節需要注意:

1. 我們沒有為左邊的兩個label控制元件指定具體的位置,在這種情況下,column將會從0開始,而row將會從第一個沒有使用的值開始。

2. 我們隊checkbutton設定了columnspan引數,所以它會顯示在第二行,並佔據第0和1列。

3. 影象label佔用了2行2列,而最後的兩個button都只佔用了1列。