'''
Tkinter教程之Pack篇
'''
#
Pack为一布局管理器,可将它视为一个弹性的容器
'''
1.一个空的widget
'''
#
不使用pack
#
-*- coding: cp936 -*-
from
Tkinter
import
*
root
=
Tk()
#
查看当前root下的子组件,解释器没有报异常,说明Pack已创建,并可以使用,此时的输出为空,即root没有任何子组件。
print
root.pack_slaves()
#
向root中pack一个Label
Label(root,text
=
'
pack
'
).pack()
#
再次打印出root的子组件,可以看到已经包含一个组件,即刚才创建的Label,说明Label调用pack()是将自己加入到了root中。
print
root.pack_slaves()
root.mainloop()
#
pack_salves打印当前组件包拥有的子组件,通过这个函数可以查看各个组件是否有包含关系。
'''
2.root与Pack的关系
'''
#
-*- coding: cp936 -*-
#
使用文字create_text
from
Tkinter
import
*
root
=
Tk()
#
改变root的大小为80x80
root.geometry(
'
80x80+0+0
'
)
print
root.pack_slaves()
Label(root,text
=
'
pack
'
).pack()
print
root.pack_slaves()
root.mainloop()
#
可以看出Pack的结果没有什么变化,它不对root产生影响,也就是说Pack可以“缩小”至只包含一个Label组件,root可以自己控件自己的大小。
'''
3.向Pack中添加多个组件
'''
#
-*- coding: cp936 -*-
#
向Pack中添加多个Label
from
Tkinter
import
*
root
=
Tk()
#
改变root的大小为80x80
root.geometry(
'
80x80+0+0
'
)
print
root.pack_slaves()
for
i
in
range(
5
):
Label(root,text
=
'
pack
'
+
str(i)).pack()
print
root.pack_slaves()
root.mainloop()
#
使用用默认的设置pack将向下添加组件,第一个在最上方,然后是依次向下排列。注意最后一个Label的显示不完全,稍后解释原因
'''
4.固定设置到自由变化
'''
#
上例中看到label4没有显示完全
#
-*- coding: cp936 -*-
#
不设置root的大小,使用默认
from
Tkinter
import
*
root
=
Tk()
#
去掉下面的这句
#
root.geometry('80x80+0+0')
print
root.pack_slaves()
for
i
in
range(
5
):
Label(root,text
=
'
pack
'
+
str(i)).pack()
print
root.pack_slaves()
root.mainloop()
#
使用用默认的设置pack将向下添加组件,第一个在最上方,然后是依次向下排列。这样的话最后一个已经显示出来的,这就是为什么称Pack为弹性的容器的原因了,虽然有这个特性,但它并不是总是能够按照我们的意思进行布局,我们可以强制设置容器的大小,以覆盖Pack的默认设置。Pack的优先级低。
'''
5.fill如何控制子组件的布局
'''
#
-*- coding: cp936 -*-
#
不设置root的大小,使用默认
from
Tkinter
import
*
root
=
Tk()
#
改变root的大小为80x80
root.geometry(
'
80x80+0+0
'
)
print
root.pack_slaves()
#
创建三个Label分别使用不同的fill属性
Label(root,text
=
'
pack1
'
,bg
=
'
red
'
).pack(fill
=
Y)
Label(root,text
=
'
pack2
'
,bg
=
'
blue
'
).pack(fill
=
BOTH)
Label(root,text
=
'
pack3
'
,bg
=
'
green
'
).pack(fill
=
X)
print
root.pack_slaves()
root.mainloop()
#
第一个只保证在Y方向填充,第二个保证在XY两个方向上填充,第三个不使用填充属性,注意Pack只会吝啬地给出可以容纳这三个组件的最小区域,它不允许使用剩余的空间了,故下方留有“空白”。
'''
6.expand如何控制组件的布局
'''
#
-*- coding: cp936 -*-
#
这个属性指定如何使用额外的空间,即上例中留下来的“空白”
from
Tkinter
import
*
root
=
Tk()
#
改变root的大小为80x80
root.geometry(
'
80x80+0+0
'
)
print
root.pack_slaves()
#
创建三个Label分别使用不同的fill属性
Label(root,text
=
'
pack1
'
,bg
=
'
red
'
).pack(fill
=
Y,expand
=
1
)
Label(root,text
=
'
pack2
'
,bg
=
'
blue
'
).pack(fill
=
BOTH,expand
=
1
)
Label(root,text
=
'
pack3
'
,bg
=
'
green
'
).pack(fill
=
X,expand
=
0)
print
root.pack_slaves()
root.mainloop()
#
第一个只保证在Y方向填充,第二个保证在XY两个方向上填充,第三个不使用填充属性,这个例子中第一个Label和第二个Label使用了expand = 1属性,而第三个使用expand = 0属性,改变root的大小,可以看到Label1和Label2是随着root的大小变化而变化(严格地它的可用空间在变化),第三个只中使用fill进行X方向上的填充,不使用额外的空间。
'''
7.改变组件的排放位置
'''
#
使用side属性改变放置位置
#
-*- coding: cp936 -*-
from
Tkinter
import
*
root
=
Tk()
#
改变root的大小为80x80
root.geometry(
'
80x80+0+0
'
)
print
root.pack_slaves()
#
创建三个Label分别使用不同的fill属性,改为水平放置
#
将第一个Label居左放置
Label(root,text
=
'
pack1
'
,bg
=
'
red
'
).pack(fill
=
Y,expand
=
1
,side
=
LEFT)
#
将第二个Label居右放置
Label(root,text
=
'
pack2
'
,bg
=
'
blue
'
).pack(fill
=
BOTH,expand
=
1
,side
=
RIGHT)
#
将第三个Label居左放置,靠Label放置,注意它不会放到Label1的左边
Label(root,text
=
'
pack3
'
,bg
=
'
green
'
).pack(fill
=
X,expand
=
0,side
=
LEFT)
print
root.pack_slaves()
root.mainloop()
#
第一个只保证在Y方向填充,第二个保证在XY两个方向上填充,第三个不使用填充属性,这个例子中第一个Label和第二个Label使用了expand = 1属性,而第三个使用expand = 0属性,改变root的大小,可以看到Label1和Label2是随着root的大小变化而变化(严格地它的可用空间在变化),第三个只中使用fill进行X方向上的填充,不使用额外的空间。
'''
8.设置组件之间的间隙大小
'''
#
ipadx设置内部间隙
#
padx设置外部间隙
#
-*- coding: cp936 -*-
#
不设置root的大小,使用默认
from
Tkinter
import
*
root
=
Tk()
#
改变root的大小为80x80
#
root.geometry('80x80+0+0')
print
root.pack_slaves()
#
创建三个Label分别使用不同的fill属性,改为水平放置
#
将第一个LabelFrame居左放置
L1
=
LabelFrame(root,text
=
'
pack1
'
,bg
=
'
red
'
)
#
设置ipadx属性为20
L1.pack(side
=
LEFT,ipadx
=
20
)
Label(L1,
text
=
'
inside
'
,
bg
=
'
blue
'
).pack(expand
=
1
,side
=
LEFT)
L2
=
Label(root,
text
=
'
pack2
'
,
bg
=
'
blue
'
).pack(fill
=
BOTH,expand
=
1
,side
=
LEFT,padx
=
10
)
L3
=
Label(root,
text
=
'
pack3
'
,
bg
=
'
green
'
).pack(fill
=
X,expand
=
0,side
=
LEFT,pady
=
10
)
print
root.pack_slaves()
root.mainloop()
#
为了演示ipadx/padx,创建了一个LabelFrame设置它的ipadx为20,即内部间隔值为20,它的子组件若使用则会留出20个单位;Label2和Label3分别设置x和y方向上的外部间隔值,所有与之排列的组件会与之保留10个单位值的距离
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)