Python爬蟲、數(shù)據(jù)分析、網(wǎng)站開發(fā)等案例教程視頻免費(fèi)在線觀看 https://space.bilibili.com/523606542 前言什么是布局管理器?說白了就是管理你的那些組件如何排列的家伙。Tkinter有三個布局管理器,分別是pack、grid和place,其中: pack是按添加順序排列組件。 grid是按行/列形式排列組件。 place允許程序員指定組件的大小和位置。 packpack其實(shí)之前的例子一直在用,對比grid管理器,pack更適用于少量組件的排列,但它在使用上更加簡單。如果需要創(chuàng)建相對復(fù)雜的布局結(jié)構(gòu),那么建議是使用多個框架(Frame)結(jié)構(gòu),或者使用grid管理器實(shí)現(xiàn)。 不要在同一個父組件中混合使用pack和grid,因?yàn)門kinter會很認(rèn)真地在那兒計算到底先使用哪個布局管理器……以至于你等了半個小時,Tkinter還在那兒糾結(jié)不出結(jié)果! 我們常常會遇到的一個情況是將一個組件放到一個容器組件中,并填充整個父組件。下面生成一個Listbox組件并將它填充到root窗口中: import tkinter as tk root = tk.Tk() listbox = tk.Listbox(root) listbox.pack(fill=tk.BOTH, expand=True) for i in range(10): listbox.insert(tk.END, str(i)) root.mainloop()
其中,fill選項(xiàng)是告訴窗口管理器該組件將填充整個分配給它的空間,BOTH表示同時橫向和縱向擴(kuò)展,X表示橫向,Y表示縱向;expand選項(xiàng)是告訴窗口管理器將父組件的額外空間也填滿。 默認(rèn)情況下,pack是將添加的組件依次縱向排列: import tkinter as tk root = tk.Tk() tk.Label(root,text="Red",bg="red",fg="white").pack(fill=tk.X) tk.Label(root,text="Green",bg="green",fg="black").pack(fill=tk.X) tk.Label(root,text="Blue",bg="blue",fg="white").pack(fill=tk.X) tk.mainloop()
如果想要組件橫向挨個兒排列,可以使用side選項(xiàng): import tkinter as tk root = tk.Tk() tk.Label(root,text="Red",bg="red",fg="white").pack(side=tk.LEFT) tk.Label(root,text="Green",bg="green",fg="black").pack(side=tk.LEFT) tk.Label(root,text="Blue",bg="blue",fg="white").pack(side=tk.LEFT) tk.mainloop()
gridgrid管理器可以說是Tkinter這三個布局管理器中最靈活多變的。當(dāng)你在設(shè)計對話框的時候,使用gird尤其便捷。如果你此前一直在用pack構(gòu)造窗口布局,那么學(xué)習(xí)完grid你會悔恨當(dāng)初為啥不早學(xué)它。使用一個grid就可以簡單地實(shí)現(xiàn)你用很多個框架和pack搭建起來的效果。 使用grid排列組件,只需告訴它你想要將組件放置的位置(行/列,row選項(xiàng)指定行,cloumn選項(xiàng)指定列)。此外,你并不用提前指出網(wǎng)格(grid分布給組件的位置稱為網(wǎng)格)的尺寸,因?yàn)楣芾砥鲿詣佑嬎?/p> import tkinter as tk root = tk.Tk() # column默認(rèn)值是0 tk.Entry(root).grid(row=0, column=0) tk.Entry(root).grid(row=0, column=1) tk.Entry(root).grid(row=0, column=3) tk.Entry(root).grid(row=1, column=0) # tk.Entry(root).grid(row=1, column=1) tk.Entry(root).grid(row=1, column=3) tk.mainloop()
登錄表單 import tkinter as tk root = tk.Tk() root.geometry("300x300+150+150") # column默認(rèn)值是0 tk.Label(root, text="用戶名").grid(row=0, column=0, sticky=tk.W) tk.Entry(root) .grid(row=0, column=1) tk.Label(root, text="密碼") .grid(row=1, column=0, sticky=tk.W) tk.Entry(root, show="*") .grid(row=1, column=1) tk.mainloop()
默認(rèn)情況下組件會居中顯示在對應(yīng)的網(wǎng)格里,你可以使用sticky選項(xiàng)來修改這一特性。該選項(xiàng)可以使用的值有E、W、S、N(EWSN分別表示東西南北,即上北下南左西右東)以及它們的組合。因此,可以通過sticky=W使得Label左對齊: tk.Label(root, text="密碼") .grid(row=1, column=0, sticky=tk.W) tk.Entry(root, show="*") .grid(row=1, column=1)
有時候可能需要用幾個網(wǎng)格來放置一個組件,可以做到嗎?當(dāng)然可以,只需要指定rowspan和columnspan就可以實(shí)現(xiàn)跨行和跨列的功能: 跨行和跨列布局 import tkinter as tk root = tk.Tk() # column默認(rèn)值是0 tk.Label(root, text="用戶名").grid(row=0,column=0,sticky=tk.W) tk.Entry(root) .grid(row=0, column=1) tk.Label(root, text="密碼") .grid(row=1, column=0, sticky=tk.W) tk.Entry(root, show="*") .grid(row=1, column=1) photo = tk.PhotoImage(file="../../../assets/logo.png") tk.Label(root,image=photo).grid(row=0,column=2,rowspan=2, padx=5, pady=5) tk.Button(text="提交",width=10).grid(row=2,column=0,columnspan=3, pady=5) tk.mainloop()
place通常情況下不建議使用place布局管理器,因?yàn)閷Ρ绕餻ack和grid,place要做更多的工作。不過純在即合理,place在一些特殊的情況下可以發(fā)揮妙用。請看下面的例子。 使用place,可以將子組件顯示在父組件的正中間: import tkinter as tk root = tk.Tk() def callback(): print("正中靶心") tk.Button(root, text="點(diǎn)我",command=callback).place(relx=0.5, rely=0.5, anchor=tk.CENTER) tk.mainloop
在某種情況下,或許你希望一個組件可以覆蓋另一個組件,那么place又可以派上用場了。下面例子演示用Button覆蓋Label組件: import tkinter as tk root = tk.Tk() def callback(): print("正中靶心") photo = tk.PhotoImage(file="../../assets/logo.png") tk.Label(root, image=photo).pack() tk.Button(root, text="點(diǎn)我",command=callback).place(relx=0.5, rely=0.5, anchor=tk.CENTER) tk.mainloop()
利用 place 覆蓋組件 不難看出,relx和rely選項(xiàng)指定的是相對于父組件的位置,范圍是00~1.0,因此0.5表示位于正中間。那么relwidth和relheight選項(xiàng)則是指定相對于父組件的尺寸: 相對位置和相對尺寸 import tkinter as tk root = tk.Tk() tk.Label(root, bg="red").place(relx=0.5, rely=0.5, relheight=0.75, relwidth=0.75, anchor=tk.CENTER) tk.Label(root, bg="yellow").place(relx=0.5, rely=0.5, relheight=0.5, relwidth=0.5, anchor=tk.CENTER) tk.Label(root, bg="green").place(relx=0.5, rely=0.5, relheight=0.25, relwidth=0.25, anchor=tk.CENTER) tk.mainloop()
對于上面的代碼,無論你如何拉伸改變窗口,三個 Label的尺寸均會跟著同步。 |
|