Tkinter教程之Pack篇

'''Tkinter教程之Pack篇'''
# Pack为一布局管理器,可将它视为一个弹性的容器
'''1.一个空的widget'''
# 不使用pack
# -*- coding: utf-8 -*-
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: utf-8 -*-
# 使用文字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: utf-8 -*-
# 向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: utf-8 -*-
# 不设置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: utf-8 -*-
# 不设置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: utf-8 -*-
# 这个属性指定如何使用额外的空间,即上例中留下来的“空白”
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: utf-8 -*-
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: utf-8 -*-
# 不设置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个单位值的距离

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值