GUI 编程就像儿童的积木。每个块应该放在哪里,每个块应该显示多大,即需要管理大小和位置,布局管理器负责管理每个组件的大小和位置。此外,当用户调整窗口大小时,布局管理器会自动调整窗口中组件的大小和位置。
python学习网,大量的免费
,欢迎在线学习!
如果使用 Pack 布局,当程序向容器中添加组件时,这些组件会一个接一个地排列,可以是水平的,也可以是垂直的。
下面的程序简单演示了 Pack 布局的使用,它在窗口中添加了三个 Label 组件:
# Python 2.x使用这行
#from Tkinter import *
# Python 3.x使用这行
from tkinter import *
# 创建窗口并设置窗口标题
root = Tk()
# 设置窗口标题
root.title('Pack布局')
for i in range(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)
Help on function pack_configure in module tkinter:
pack_configure(self, cnf={}, **kw)
Pack a widget in the parent widget. Use as options:
after=widget - pack it after you have packed widget
anchor=NSEW (or subset) - position widget according to
given direction
before=widget - pack it before you will pack widget
expand=bool - expand widget if parent size grows
fill=NONE or X or Y or BOTH - fill widget if widget grows
in=master - use master to contain this widget
in_=master - see 'in' option description
ipadx=amount - add internal padding in x direction
ipady=amount - add internal padding in y direction
padx=amount - add padding in x direction
pady=amount - add padding in y direction
side=TOP or BOTTOM or LEFT or RIGHT - where to add this widget.
从以上显示信息可以看出,pack()方法通常支持以下选项:
anchor:当可用空间大于组件所需的大小时,该选项决定组件在容器中的放置位置。该选项支持N(北,代表上),E(东,代表右),S(南,代表下),W(西,代表左),NW(西北,代表左上),NE(东北,代表上) right)、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添加到窗口中。例如下面的程序:
# Python 2.x使用这行
#from Tkinter import *
# Python 3.x使用这行
from tkinter import *
class App:
def __init__(self, master):
self.master = master
self.initWidgets()
def initWidgets(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里面的三个按钮都不能填充。
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ python守护线程是如何创建的?01/12
- ♥ python比php强大的原因是什么11/11
- ♥ 如何在 Python 中四舍五入?09/15
- ♥ Python中排序函数sort和sorted的区别09/27
- ♥ python多处理和多线程的简单区别11/16
- ♥ 如何在python中获取输入数字10/04
内容反馈