用Tkinter打造GUI開發工具(12)Tkinter小部件的grid佈局
部件的網格放置grid()方法是使用行列位置的方法放置部件。 grid()方法佈局管理器會將控件放置到一個二維的表格裏。主控件被分割成一系列的行和列,表格中的每個單元(cell)都可以放置一個控件。
grid()是Tkinter裏面最爲靈活的幾何管理佈局器。grid()方法不能和pack()方法混用。
當你設計對話框的時候,grid佈局管理器是一個非常方便的工具。在大多數情況下,你只需要將所有控件放置到容器類部件中,然後使用grid將它們佈局到任何你想要佈局的地方。
使用pack進行佈局的話,你可能需要一些額外的Frame控件,並自行調整。如果你使用grid的話,你只需要對每個控件使用grid(),所有的東西都會以合適的方式顯示。
使用grid()顯示一個小部件w,其語法格式如下。
w.grid(option=value, ...)
grid()方法參數option見表。
參數 | 說明 |
---|---|
column | 部件所在的起始列位置。 |
columnspan | 部件的列寬,跨列數。 |
in_ | in_=w2使用。將w註冊爲w2部件的子部件。 |
ipadx | 設置部件裏面水平方向空白區域大小。 |
ipady | 設置部件裏面垂直方向空白區域大小。 |
padx | x方向間距。 |
pady | y方向間距。 |
row | 部件所在的起始行位置。 |
rowspan | 部件所跨的行數。 |
sticky | 對齊方式:NSEW(北南東西)上下右左。 |
由於我們的程序大多數都是矩形,因此特別適合於網格佈局,即 grid 佈局。
使用 grid()佈局方法,至少給兩個參數,用 row 表示行,用 column 表示列,其中值得注意的是 row 和 column 的編號都從 0 開始。
grid()函數還有個 sticky 參數,它可以用 N,E,S,W 表示上右下左,它決定了子部件對齊的位置。
sticky=N/S/E/W:頂端對齊/底端對齊/右對齊/左對齊。
sticky=N+S:拉伸高度,使其在水平方向上頂端和底端都對齊。
sticky=E+W,拉伸寬度,使其在垂直方向上左邊界和右邊界都對齊。
grid()佈局直接用後面的行和列的數字來指定了它位於的位置,而不必使用其他參數。
grid()函數也支持諸如 ipadx,ipady,padx,pady,意思與pack 函數相同,默認邊距是 0。
Tkinter的Grid類,除了grid()方法外,還提供有一些方法。
-
常用方法
w.grid_bbox ( column=None, row=None, col2=None, row2=None )
返回一個4成員元組,描述W部件中的部分或全部網格系統的包圍框。返回的前兩個數字是該區域左上角的X和Y座標,第二個數字是寬度和高度。
如果你通過參數列column和參數行row,返回的包圍框描述了該列和行中單元格的區域。如果你也通過參數 col2和 row2,返回的包圍框描述了從列column到col2的網格區域,並從行row 到row2包含的網格區域。
例如,w.grid_bbox(0,0,1,1)返回四個單元格的包圍框,而不是一個。
w.grid_forget()
此方法使W部件從屏幕上消失。它仍然存在,只是看不見。你可以使用.grid() 使它再次出現,但它不會記得它的上次網格選項。
w.grid_info()
返回一個字典,其關鍵字是W的選項名,與這些grid選項對應的值。
w.grid_location ( x, y )
給定相對於包含部件的座標 (x, y) ,此方法返回一個元組(col, row),描述W網格系統中包含該屏幕座標的單元格。
w.grid_propagate()
通常,所有的部件都傳遞它們的尺寸,也就是說它們會根據內容進行調整。然而,有時候你想強迫一個部件有一定的尺寸,不管裏面的東西有多大。要做到這一點,調用w.grid_propagate(0),其中W是要強制大小的部件。
w.grid_remove()
這個方法就像.grid_forget(),但它的網格grid選項被記住了,所以,如果你再來一遍 .grid(),它將使用上一次相同的網格grid配置選項。
w.grid_size()
返回在W的網格系統中。包含列數和行數的2元素元組。
w.grid_slaves ( row=None, column=None )
返回由W部件管理的部件列表。如果不提供參數,您將得到所有託管部件的列表。使用row= argument。只選擇一行中的部件;或column= argument只選擇列中的部件。 -
配置列和行大小
除非您採取某些措施,否則給定部件內的網格列的寬度將等於其最寬單元格的寬度,
網格行的高度將是其最高的單元格的高度。
如果您想要覆蓋此列和行的自動調整大小,在包含網格佈局的父部件W上使用這些方法:
小部件上的粘性屬性sticky只控制在不完全填充單元格的情況下放置的位置。
w.columnconfigure ( N, option=value, … )
在W部件內部的網格佈局中,配置列n,使給定的選項具有給定的值。有關選項,請參見下面。
w.rowconfigure ( N, option=value, … )
在W部件內部的網格佈局中,配置行n,以便給定的選項具有給定的值。有關選項,請參見下面。
這裏是配置列和行大小的選項。
minsize : 列或行的最小大小,單位爲像素。如果在給定的列或行中沒有任何內容,即使您使用此選項,它也不會出現。
pad:將添加到給定列或行的像素數,超過或超過列或行中最大的單元格。
weigh:要使列或行具有可伸縮性,請使用此選項並提供一個值,該值給出分配多餘空間時,此列或行的相對權重。
例如,如果部件W包含網格佈局,這些線路將分配四分之三的額外第一欄的空格和第二欄的空格:w.columnconfigure(0, weight=3)
w.columnconfigure(1, weight=1)
如果不使用此選項,則列或行不會拉長。
下面看一個Grid示例。# -*- coding: utf-8 -*- from time import sleep import tkinter as tk root=tk.Tk() #闖將 Tk主窗口 colours = ['white','black','red','green','blue','cyan','yellow','magenta'] lables=[] entrys=[] r = 0 for c in colours: l=tk.Label(root,text=c, relief=tk.RIDGE,width=10) l.grid(row=r,column=0) e=tk.Entry(root,bg=c, relief=tk.SUNKEN,width=10) e.grid(row=r,column=1) lables.append(l) entrys.append(e) r = r + 1 root.update() sleep(5) #暫停5秒 lables[2].grid_forget() entrys[4].grid_forget() lables[2].grid(row=4,column=1) entrys[4].grid(row=2,column=0) lables[5].grid_configure(row=8,column=0,columnspan=2) print(entrys[3].grid_info()) root.mainloop() #開啓Tkinter主循環
程序運行後,前5秒是一個佈局,5秒後,通過grid_forget()或grid _configure()等方法改變了佈局。
3. 隨根窗口自動調整大小
您是否希望用戶調整整個應用程序窗口的大小,把多餘的空間分配給它的內部部件? 這需要一些不明顯的操作。
有必要將這些技術用於行和列的大小管理,“配置列和行大小”,以使應用程序部件的網格可伸縮的方法,顯然是是不夠用的。
下面程序可以實現按鈕使用grid()方法,並使部件隨窗口大小而改變尺寸。
# -*- coding: utf-8 -*-
import tkinter as tk
class Application(tk.Frame):
def __init__(self, master=None):
self.master=master
tk.Frame.__init__(self, master)
#self.grid()
self.grid(sticky=tk.N+tk.S+tk.E+tk.W)
self.createWidgets2()
def createWidgets(self):
self.quitButton = tk.Button ( self, text='Quit',
command=self.quit )
self.quitButton.grid()
def createWidgets2(self):
top=self.winfo_toplevel()
top.rowconfigure(0, weight=1)
top.columnconfigure(0, weight=1)
self.rowconfigure(0, weight=1)
self.columnconfigure(0, weight=1)
self.quit = tk.Button ( self, text="Quit", command=self.quit )
self.quit.grid(row=0, column=0,
sticky=tk.N+tk.S+tk.E+tk.W)
def quit(self):
self.master.destroy()
app = Application(tk.Tk())
app.master.title("grid自動改變大小的應用程序演示")
app.mainloop()
Button按鈕隨root窗口大小會調整大小,grid佔滿整個窗口。