Python Tkinter Pack布局管理器

GUI 编程相当于孩子们建造积木。每个块应该放在哪里,每个块显示多大,即需要管理大小和位置,布局管理器负责管理每个组件的大小和位置。此外,当用户调整窗口的大小时,布局管理器会自动调整窗口中每个组件的大小和位置。
python学习网,大量免费python视频教程,欢迎在线学习!
如果使用 Pack 在布局上,当程序将组件添加到容器中时,这些组件将依次向后排列,排列方向可以是水平的或垂直的。
以下程序简单示范 Pack 该程序在窗口中添加了三个布局用法 Label 组件:
#Python2.x使用这行
#fromTkinterimport*
#Python3.x使用这行
fromtkinterimport*
#创建窗口并设置窗口标题
root=Tk()
#设置窗口标题
root.title('Pack布局')
foriinrange(3):
lab=Label(root,text="第%d个Label"%(i+1),bg='#eeeeee')
#调用pack进行布局
lab.pack()
#启动主窗口的消息循环
root.mainloop()上面的程序创建了一个窗口,然后创建了三个循环 Label,并对这三个 Label 使用了 pack() 默认方法 Pack 布局。在操作程序时,可以看到如图所示的界面:

上图使用默认情况。 Pack 事实上,程序正在调用布局 pack() 多个选项可以在方法中输入。例如,通过help(tkinter.Label.pack)命令来查看 pack() 方法支持的选项可见以下输出结果:
>>>help(tkinter.Label.pack)
Helponfunctionpack_configureinmoduletkinter:
pack_configure(self,cnf={},**kw)
Packawidgetintheparentwidget.Useasoptions:
after=widget-packitafteryouhavepackedwidget
anchor=NSEW(orsubset)-positionwidgetaccordingto
givendirection
before=widget-packitbeforeyouwillpackwidget
expand=bool-expandwidgetifparentsizegrows
fill=NONEorXorYorBOTH-fillwidgetifwidgetgrows
in=master-usemastertocontainthiswidget
in_=master-see'in'optiondescription
ipadx=amount-addinternalpaddinginxdirection
ipady=amount-addinternalpaddinginydirection
padx=amount-addpaddinginxdirection
pady=amount-addpaddinginydirection
side=TOPorBOTTOMorLEFTorRIGHT-wheretoaddthiswidget.从上面的显示信息可以看出,pack() 该方法通常支持以下选项:
anchor:当可用空间大于组件所需的大小时,该选项决定了组件放置在容器中的位置。该选项支持 N(北,代表)、E(东,代表右)、S(南,代表下)、W(西,左)、NW(西北,代表左上)、NE(东北,代表右上)、SW(西南,左下)、SE(东南,代表右下)、CENTER(中,默认值)这些值。
expand:该 bool 当父容器增大时,指定是否拉伸组件。
fill:设置组件是否沿水平或垂直方向填充。该选项支持 NONE、X、Y、BOTH 四个值,其中 NONE 表示不填,BOTH 表示沿两个方向填充。
ipadx:指定组件在 x 方向(水平)上的内部空白(padding)。
ipady:指定组件在 y 方向(水平)上的内部空白(padding)。
padx:指定组件在 x 方向(水平)与其它组件之间的距离。
pady:指定组件在 y 方向(水平)与其他组件之间的距离。
side:组件的添加位置可以设置为 TOP、BOTTOM、LEFT 或 RIGHT 这四个值之一。
当程序界面复杂时,需要使用多个容器(Frame)分开布局,然后将其分开 Frame 将其添加到窗口中。例如:
#Python2.x使用这行
#fromTkinterimport*
#Python3.x使用这行
fromtkinterimport*
classApp:
def__init__(self,master):
self.master=master
self.initWidgets()
definitWidgets(self):
#创建第一个容器
fm1=Frame(self.master)
#这个容器放在左边
fm1.pack(side=LEFT,fill=BOTH,expand=YES)
#向fm1添加3个按钮
#设置按钮从顶部排列,按钮只能垂直排列(X)方向填充
Button(fm1,text='第一个').pack(side=TOP,fill=X,expand=YES)
Button(fm1,text='第二个').pack(side=TOP,fill=X,expand=YES)
Button(fm1,text='第三个').pack(side=TOP,fill=X,expand=YES)
#创建第二个容器
fm2=Frame(self.master)
#当容器排列在左边时,它将靠近fm1
fm2.pack(side=LEFT,padx=10,expand=YES)
fm2.pack(side=LEFT,padx=10,fill=BOTH,expand=YES)
#向fm2添加3个按钮
#设置按钮从右侧开始排列
Button(fm2,text='第一个').pack(side=RIGHT,fill=Y,expand=YES)
Button(fm2,text='第二个').pack(side=RIGHT,fill=Y,expand=YES)
Button(fm2,text='第三个').pack(side=RIGHT,fill=Y,expand=YES)
#创建第三个容器
fm3=Frame(self.master)
#当容器排列在右侧时,它将靠近fm1
fm3.pack(side=RIGHT,padx=10,fill=BOTH,expand=YES)
#向fm3添加3个按钮
#设置按钮从底部排列,按钮只能垂直(Y)方向填充
Button(fm3,text='第一个').pack(side=BOTTOM,fill=Y,expand=YES)
Button(fm3,text='第二个').pack(side=BOTTOM,fill=Y,expand=YES)
Button(fm3,text='第三个').pack(side=BOTTOM,fill=Y,expand=YES)
root=Tk()
root.title("Pack布局")
display=App(root)
root.mainloop()创建了三个程序 Frame 第一个容器 Frame 容器包含从顶部三个容器(TOP)开始排列的按钮意味着这三个按钮将从上到下排列,这三个按钮可以水平排列(X)填充方向;第二个 Frame 三个包含在容器中从右边(RIGHT)开始排列的按钮意味着这三个按钮将从右到左排列;第三个 Frame 容器包含三个从底部的容器(BOTTOM)开始排列的按钮意味着这三个按钮将从下到上排列,这三个按钮可以垂直排列(Y)填充方向。
操作上述程序,将看到下图所示的界面。

从上图可以看出,为运行效果增加了三个框,分别代表 fm1、fm2、fm3(其实容器是看不见的),这个时候可以看到 fm1 三个按钮从上到下排列,可以水平填充;fm3 三个按钮从下到上排列,可以垂直填充。
有些读者可能会有疑问,fm2 内部的三个按钮也设置了 fill=Y,expand=YES,这表明它们也可以在垂直方向上填充,为什么不愿意看到呢?仔细看看 fm2.pack(side=LEFT, padx=10, expand= YES)这行代码,它解释 fm2 本身没有向任何方向填充,所以 fm2 内部的三个按钮无法填充。
