用Tkinter打造GUI開發工具(12)Tkinter小部件的grid佈局

用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()方法外,還提供有一些方法。

  1. 常用方法
    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只選擇列中的部件。

  2. 配置列和行大小
    除非您採取某些措施,否則給定部件內的網格列的寬度將等於其最寬單元格的寬度,
    網格行的高度將是其最高的單元格的高度。
    如果您想要覆蓋此列和行的自動調整大小,在包含網格佈局的父部件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佔滿整個窗口。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章