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控件里。

原文地址:https://www.cnblogs.com/s1mplelectronic/p/13972093.html