专栏首页python3tkinter -- Pack

tkinter -- Pack

Pack 为一布局管理器,可将它视为一个弹性的容器

一个空的 widget

代码:

import tkinter as tk
root = tk.Tk()
# 查看当前 root 下的子组件,解释器没有报异常,说明 Pack 已创建,
# 并可以使用,此时的输出为空,即 root 没有任何子组件
print(root.pack_slaves())

# 向 root 中 pack 一个 Label
tk.Label(root,text='pack').pack()

# 再次打印出 root 的子组件,可以看到已经包含一个组件,
# 即刚才创建的 Label,说明 Label调用 pack()是将自己加入到了 root 中
print(root.pack_slaves())
root.mainloop()

结果:

pack_salves 打印当前组件包拥有的子组件,通过这个函数可以查看各个组件是否有包含关系

root 与 Pack 的关系

使用文字 create_text

代码:

import tkinter as tk
root = tk.Tk()
# 改变 root 的大小为80x80
root.geometry('80x80+0+0')
print(root.pack_slaves())  # 查看组件是否存在

# 向 root 中 pack 一个 Label
tk.Label(root,text='pack').pack()
print(root.pack_slaves())  # 查看组件是否存在

root.mainloop()

结果:

可以看出 Pack 的结果没有什么变化,它不对 root 产生影响,也就是说 Pack 可以“缩小”至只包含一个 Label 组件,root 可以自己控件自己的大小

向 Pack 中添加多个组件

向 Pack 中添加多个 Label

代码:

import tkinter as tk
root = tk.Tk()
# 改变 root 的大小为80x80
root.geometry('80x80+0+0')
print(root.pack_slaves())  # 查看组件是否存在

# 向 root 中 pack 多个 Label
for i in range(5):
    tk.Label(root, text='pack'+str(i)).pack()
print(root.pack_slaves())  # 查看组件是否存在

root.mainloop()

结果:

使用用默认的设置 pack 将向下添加组件,第一个在最上方,然后是依次向下排列。注意最后一个 Label 的显示不完全,因为root大小设置了,Label超出范围了

固定设置到自由变化

上例中看到 label4没有显示完全

代码:

import tkinter as tk
root = tk.Tk()


# 向 root 中 pack 多个 Label
for i in range(5):
    tk.Label(root, text='pack'+str(i)).pack()
print(root.pack_slaves())  # 查看组件是否存在

root.mainloop()

结果:

使用用默认的设置 pack 将向下添加组件,第一个在最上方,然后是依次向下排列。这样的话最后一个已经显示出来的,这就是为什么称 Pack 为弹性的容器的原因了,虽然有这个特性,但它并不是总是能够按照我们的意思进行布局,我们可以强制设置容器的大小,以覆盖 Pack 的默认设置。Pack 的优先级低。

fill 如何控制子组件的布局

不设置 root 的大小,使用默认

代码:

import tkinter as tk
root = tk.Tk()

# 向 root 中 pack 多个 Label
tk.Label(root, text='pack1',bg='red').pack(fill='y')
tk.Label(root, text='pack2',bg='blue').pack(fill='both')
tk.Label(root, text='pack3',bg='green').pack(fill='x')
print(root.pack_slaves())

root.mainloop()

结果:

expand 如何控制组件的布局

这个属性指定如何使用额外的空间,即上例中留下来的“空白”

代码:

import tkinter as tk
root = tk.Tk()

# 向 root 中 pack 多个 Label
tk.Label(root, text='pack1',bg='red').pack(fill='y',expand=1)
tk.Label(root, text='pack2',bg='blue').pack(fill='both',expand=1)
tk.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 方向上的填充,不使用额外的空间

改变组件的排放位置

使用 side 属性改变放置位置

代码:

import tkinter as tk
root = tk.Tk()

# 向 root 中 pack 多个 Label
tk.Label(root, text='pack1',bg='red').pack(fill='y',expand=1,side='left')
tk.Label(root, text='pack2',bg='blue').pack(fill='both',expand=1,side='right')
tk.Label(root, text='pack3',bg='green').pack(fill='x',expand=0,side='left')
print(root.pack_slaves())

root.mainloop()

结果:

设置组件之间的间隙大小

ipadx 设置内部间隙

padx 设置外部间隙

代码:

import tkinter as tk
root = tk.Tk()

# 创建三个 Label 分别使用不同的 fill 属性,改为水平放置
# 将第一个 LabelFrame 居左放置
L1 = tk.LabelFrame(root, text='pack1', bg='red')

# 设置 ipadx 属性为20
L1.pack(side='left', ipadx=20)
tk.Label(L1, text='inside', bg='blue').pack(expand=1, side='left')

L2 = tk.Label(root, text='pack2', bg='blue').pack(fill='both',expand=1,side='left',padx=10)
L3 = tk.Label(root, text='pack3', bg='green').pack(fill='x',expand=0,side='left',pady=10)

root.mainloop()

结果:

为了演示 ipadx/padx,创建了一个 LabelFrame 设置它的 ipadx 为20,即内部间隔值为20,它的子组件若使用则会留出20个单位;Label2和 Label3分别设置 x 和 y 方向上的外部间隔值,所有与之排列的组件会与之保留10个单位值的距离

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • tkinter -- 文本的多行显示

    使用 width 和 heigth 来指定控件的大小,如果指定的大小无法满足文本的要求,

    py3study
  • python中创建和遍历二叉树

    py3study
  • 初识 Python

    [root@Client-1]# tar -xf ipython 1.2.1.tar.gz

    py3study
  • tkinter -- 文本的多行显示

    使用 width 和 heigth 来指定控件的大小,如果指定的大小无法满足文本的要求,

    py3study
  • Leetcode 129 Sum Root to Leaf Numbers

    Given a binary tree containing digits from 0-9 only, each root-to-leaf path cou...

    triplebee
  • Js算法与数据结构拾萃(4):二叉树

    因此只要答对这道题,你就可以超越世界级大牛,问鼎码林之巅(逃) 导读: •二叉树知识重点•二叉树深度不一,因此天生适用递归,因此可用递归处理•判断两树相等•翻转...

    一粒小麦
  • Mac 在命令行获得root权限

    这样就变成以root权限操作vim /etc/shells 这个命令,可以正常操作了。 

    week
  • shell脚本一步完成多层ssh跳转时的文件传输

    由于工作中,经常需要ssh连接到产线服务器进行代码调试。中间经过3层,4层甚至更多层跳转。这就导致在实际操作时常常面临两个问题:

    PedroQin
  • linux基础命令介绍九:进程与内存

    计算机存在的目的就是为了运行各种各样的程序,迄今我们介绍的绝大多数命令,都是为了完成某种计算而用编程语言编写的程序,它们以文件的形式保存在操作系统之中(比如/b...

    用户5030870
  • Golang Leetcode 226. Invert Binary Tree.go

    版权声明:原创勿转 https://blog.csdn.net/anakinsun/article/details/89043397

    anakinsun

扫码关注云+社区

领取腾讯云代金券