python tkinter pack布局遇到的錯誤和問題總結(無圖)


綜述:不論哪種布局管理器,都要清楚的概念是相對位置。它的好處是窗口是隨時都可變的,如果由相對位置來定位控件會比較方便。
體現在padx,pady,ipadx,ipady(pack,grid都有)和grid的對齊stick屬性等等方面。

tkinter讀python官方文檔學不到什么(感覺里面內容是縮水的)

推薦的網站:https://tkdocs.com/tutorial/index.html

1.pack中關於expand,side,fill組合時的使用:
fill--設置控件填滿所分配空間的方向
expand--設置是否填滿額外的父容器空間
一個特殊的案例:
·誤區:有fill一定要有expand嗎?
from tkinter import *
root = Tk()
root.geometry("500x500+500+150")
Frame(root, bg='Blue', height=200,).pack(side=TOP, fill=X, expand=1)
root.mainloop()
以上的高度和窗口的大小單位都是像素,所以Frame比root要小,但結果是由於expand的干擾,
Frame沒有做到side=TOP,如果不寫expand=1就會正確,所以當時看csdn的帖子有人說expand會使side“無效”。
但如果去測試對多個控件都設置同樣的side=TOP,fill=X,和expand=1,會發現side仍在發揮作用。所以也不是完全的無效。
真實失效的是expand=1,它的存在不會影響到fill的行動,由於沒有設置那個方向的起始大小,而是fill完全填充了那個方向。

·邏輯類錯誤:
fill的方向與設置同方向的屬性沖突:
Frame(root, bg='Blue', height=30, width=30).pack(side=TOP, fill=X, )
結果:width失效,后面的語句fill起效
缺少某一個方向屬性的設置:
Frame(root, bg='Blue', height=30, ).pack(side=TOP, fill=Y, )
結果:該方向的默認值為1,單位是像素(幾乎看不到)

·side的“鎖定”效果:
基於上面的邏輯類錯誤1,如果寫成:
Frame(root, bg='Blue', height=30, width=30).pack(side=TOP, fill=Y, )
結果:fill=Y失效了,與我分析的“pack是后面的語句,后執行,覆蓋之前的影響”的理論矛盾了。故得出side會“鎖定”這個方向。

·height,width等屬性錯誤:
很多控件都有height,width,padx等等屬性,但是它們單位可能不同,一是字符Label['height']=1是可行的,但是如果Frame['height']=1,
你很容易認為沒有看到Frame控件,因為它單位是像素。

2.常見賦值錯誤
l1 = Label(text='1',bg='Blue').pack()
此時l1為NoneType,想用變量就得把設置和pack分開寫。

3.三種布局管理器可以混用嗎?
不同種布局管理器作用在同一個父容器中會沖突(混用失敗)
在對一個父容器是root的控件使用gird之后,又對一個父容器為root的控件使用pack會報以下的錯。
_tkinter.TclError: cannot use geometry manager pack inside . which already has slaves managed by grid
而且兩者單獨顯示的時候是在窗口的兩個互不重合的位置,說明每種管理器是搶着控制根窗口root的。那么可以在兩個不同的父容器之間,用不同的布局方法嗎?
不同種管理器可以應用到不同的父容器里(混用成功)
f2 = Frame(root, bg='Red',height=200,width=300)
f2.pack(anchor='ne')
Label(f2, text='1', bg='Green', height=20, width=20).grid(row=0, column=0)
Label(f2, text='2', bg='Blue', height=20, width=20).grid(row=0, column=1)
print('height=', f2.cget('height'), 'width=', f2.cget('width'))
因為根窗口也只是一個容器罷了,它可以應用三種布局中的一種,那么其他容器也可以這么使用。
但要注意的是,在這個容器里的所有控件的布局管理選擇是要一致的,否則會報錯。
比如:在一個LabelFrame里有三個控件(它自己是用的pack),兩個用gird,另一個用pack。
gird會報錯說它的父容器已經使用pack了。但錯誤不在他這里。而在那個pack控件里。


免責聲明!

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



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