Python GUI设计:tkinter菜鸟编程
上QQ阅读APP看书,第一时间看更新

3-2 pack方法

虽然我们称pack方法,其实在tkinter内这是一个类别。这是最常使用的控件配置管理方法,它是使用相对位置的概念处理Widget控件配置,至于控件的正确位置则是由pack方法自动完成。pack方法的语法格式如下。

options参数可以是side、fill、padx/pady、ipadx/ipady、anchor。下面将分小节一一说明。

3-2-1 side参数

side参数可以垂直或水平配置控件,在进一步讲解前先看下列程序实例。

程序实例ch3_1.py:一个窗口中含有三个标签,在前两章程序中建立tk对象时是用root当作对象名称,这个对象名称可以自行命名,本章中将故意使用window当作对象名称以便读者体会。

执行结果

由上图可以看到,当窗口中有多个组件时,使用pack可以让组件由上往下排列显示,其实这也是系统的默认设置。使用pack方法时,也可以增加side参数设置组件的排列方式,此参数的取值如下。

TOP:这是默认值,由上往下排列。

BOTTOM:由下往上排列。

LEFT:由左往右排列。

RIGHT:由右往左排列。

程序实例ch3_2.py:在pack方法内增加“side=BOTTOM”重新设计ch3_1.py,另外本实例将标签的宽度改为15。

执行结果

程序实例ch3_3.py:在pack方法内增加“side=LEFT”重新设计ch3_2.py。

执行结果

程序实例ch3_4.py:重新设计ch3_3.py,混合使用side参数。

执行结果

在2-10节中介绍了Widget的常用属性relief,这里将用我们已有的知识,将其所有属性列出来。

程序实例ch3_5.py:列出relief的所有属性。

执行结果

程序实例ch3_5_1.py:列出所有bitmaps位图。

执行结果

3-2-2 padx/pady参数

另外,在使用pack方法时,可以使用padx/pady参数设定控件边界与容器(可想成窗口边界)的距离或是控件边界间的距离。在默认环境下窗口控件间的距离是1像素,如果希望有适度间距,可以设置参数padx/pady,代表水平间距/垂直间距,可以分别在组件间增加间距。

程序实例ch3_6.py:重新设计ch3_5.py,在“长庚大学”标签上下增加10像素间距。

执行结果

对上述程序而言,如果在“明志科技大学”标签pack内增加pady=10,此时“明志科技大学”标签边界与上边容器边界间距是10,但是它与“长庚大学”标签间的间距由于彼此影响所以将是20。

程序实例ch3_7.py:重新设计ch3_6.py,在“明志科技大学”标签pack内增加pady=10。

执行结果

程序实例ch3_8.py:设计三个标签,标签宽度是15字符宽,标签的左右边界与容器边界是50像素。

执行结果

程序实例ch3_9.py:重新设计ch3_3.py,在“长庚大学”标签左右增加10像素间距。

执行结果

3-2-3 ipadx/ipady参数

ipadx参数可以控制标签文字与标签容器的x轴间距,ipady参数可以控制标签文字与标签容器的y轴间距。

程序实例ch3_10.py:重新设计ch3_1.py,让“长庚大学”标签的x轴间距是10。

执行结果

程序实例ch3_11.py:重新设计ch3_10.py,让“长庚科技大学”标签的y轴间距是10。

执行结果

3-2-4 anchor参数

这个参数可以设定Widget控件在窗口中的位置,它的概念与2-4节中类似,但是本节中是指控件内容控件区域的位置设置(实际的例子中是指标签文字标签区域的位置)。

程序实例ch3_12.py:在窗口右下方建立一个内容为“OK”的标签,其中,标签与窗口右边和下方的间距是10像素。

执行结果

程序实例ch3_13.py:修改ch3_12.py,增加设计一个红底白字的“NO”内容标签。

执行结果

3-2-5 fill参数

fill参数的主要功能是告诉pack管理程序,设置控件填满所分配容器区间的方式,如果是fill=X表示控件可以填满所分配空间的X轴不留白,如果是fill=Y表示控件可以填满所分配空间的Y轴不留白,如果是fill=BOTH表示控件可以填满所分配空间的X轴和Y轴。fill默认值是NONE,表示保持原大小。

程序实例ch3_14.py:重新设计ch3_1.py,但是第一个和第三个标签在pack方法内增加fill=X参数,此时可以看到第一个和第三个标签填满X轴空间。

执行结果

如果所分配容器区间已经满了,则使用此fill参数将不会有任何作用。fill参数在使用上仍有些复杂,如果要设计复杂的Widget控件布局,建议使用3-3节所介绍的grid方法。

程序实例ch3_15.py:验证如果所分配容器区间已经满了,则使用此fill参数将不会有任何作用。重新设计ch3_14.py,但是第13行设置长庚大学fill=Y。

执行结果 与ch3_14.py相同。

由于“长庚大学”标签所分配的Y轴空间就是标签高度,所以在设置fill=Y后,不会有任何变化。

程序实例ch3_16.py:重新设计ch3_14.py将“明志科技大学”标签从左放置,“长庚大学”和“长庚科技大学”标签使用默认从上往下配置。

执行结果

上述“明志科技大学”标签就是使用fill=Y的场合。

程序实例ch3_17.py:重新设计ch3_16.py,“明志科技大学”标签从左放置同时使用fill=Y,“长庚大学”标签使用fill=X。

执行结果

通过以上设置我们得到了一个完美的配置,但是如果拖曳增加窗口大小,会看到下列结果。

上述情况出现是因为没有为“长庚科技大学”标签的X轴执行填满操作。

程序实例ch3_18.py:重新设计ch3_17.py,扩展“长庚科技大学”标签的X轴。

执行结果

如果这时拖曳增加窗口大小,可以看到下列结果。

我们成功地填满了“长庚科技大学”标签的X轴空间,但是这时也出现了一个问题,“长庚科技大学”标签并没有填满Y轴空间。其实这就是使用fill=BOTH的场合。

程序实例ch3_19.py:重新设计实例ch3_18.py,使用fill=BOTH应用在“长庚科技大学”标签上。

执行结果

从上述我们发现fill=BOTH并没有发挥作用,在扩充窗口大小时并没有扩充Y轴的空间。原因是当Widget控件从左到右配置时,pack配置管理员所配置的空间是Y轴的空间。当Widget控件从上到下配置时,pack配置管理员所配置的空间是X轴的空间。以上述实例而言,当扩充窗口大小时,“长庚科技大学”标签在Y轴的空间称为额外空间,这时需要借助3-2-6节的expand参数设置。

3-2-6 expand参数

expand参数可设定Widget控件是否填满额外的父容器空间,默认是False(或是0),表示不填满,如果是True(或是1)表示填满。

程序实例ch3_20.py:在“长庚科技大学”的标签中使用expand=True参数,并观察执行结果。

执行结果

阅读至此,读者应该了解到side、fill与expand参数是互相影响的。

程序实例ch3_21.py:从上到下配置标签,体会expand参数与fill参数的应用。

执行结果

程序实例ch3_22.py:从左到右配置标签,体会expand参数与fill参数的应用。

执行结果

3-2-7 pack的方法

pack其实在Python tkinter中是一个类别,它提供下列方法供我们使用。

程序实例ch3_23.py:重新设计ch3_13.py,列出执行前后Widget控件中的内容。

执行结果 以下是Python Shell窗口中的执行结果。