tkinter 18 布局管理器

References

Introduction

简介

tkinter 提供三种布局管理器,pack、grid 和 place,他们均用于管理同在一个父组件下的所有组件的布局。

使用

Pack

例子1-一个组件放到一个容器组件中,并填充整个父组件

属性总结

from tkinter import *

root = Tk()

listbox = Listbox(root)
listbox.pack(fill=BOTH, expand=True)

for i in range(10):
    listbox.insert(END, str(i))

mainloop()

例子2-添加一堆组件并对齐

属性总结

def test_pack(master=None):
    frm1 = Frame(master, bg='grey', height=100, width=200)
    frm1.pack(side='right', padx=20, anchor='ne')

    frm2 = Frame(master, bg='blue', height=100, width=200)
    frm2.pack(side='left', anchor='nw', ipadx=20, ipady=20)
    Label(frm2, text="Red", bg="red", fg="white").pack(fill=X, expand=True, padx=10)
    Label(frm2, text="Green", bg="green", fg="black").pack(fill=X, expand=True, pady=10)
    Label(frm2, text="Blue", bg="blue", fg="white").pack(fill=X)

属性总结 pack(**options)

选项 含义
anchor 1. 控制组件在 pack 分配的空间中的位置 2. N, NE, E, SE, S, SW, W, NW, 或 CENTER 来定位(EWSN代表东西南北,上北下南左西右东) 3. 默认值是 CENTER
expand 1. 指定是否填充父组件的额外空间 2. 默认值是 False
fill 1. 指定填充 pack 分配的空间 2. 默认值是 NONE,表示保持子组件的原始尺寸 3. 还可以使用的值有:X(水平填充),Y(垂直填充)和 BOTH(水平和垂直填充)
in_ 1. 将该组件放到该选项指定的组件中 2. 指定的组件必须是该组件的父组件
ipadx 指定水平方向上的内边距
ipady 指定垂直方向上的内边距
padx 指定水平方向上的外边距
pady 指定垂直方向上的外边距
side 1. 指定组件的放置位置 2. 默认值是 TOP 3. 还可以设置的值有:LEFT,BOTTOM,RIGHT

方法总结

Grid

实现机制是将Widget逻辑上分割成表格,在指定的位置放置想要的Widget就可以了。

实例-登陆界面

def test_grid(master=None):
    Label(master, text="用户名").grid(row=0, sticky=W)
    Label(master, text="密码").grid(row=1, sticky=W)

    Entry(master).grid(row=0, column=1)
    Entry(master, show="*").grid(row=1, column=1)

    photo = PhotoImage(file="PICS/18.gif")
    lb = Label(master, image=photo)
    lb.image = photo
    lb.grid(row=0, column=2, rowspan=2, padx=5, pady=5)

    Button(text="提交", width=10).grid(row=2, columnspan=3, pady=5)

    # 设置使得网格可伸缩
    master.grid_columnconfigure(0, weight=1)
    master.grid_columnconfigure(1, weight=1)
    master.grid_columnconfigure(2, weight=1)

属性总结 grid(**options)

选项 含义
column 1. 指定组件插入的列(0 表示第 1 列) 2. 默认值是 0
columnspan 指定用多少列(跨列)显示该组件
in_ 1. 将该组件放到该选项指定的组件中 2. 指定的组件必须是该组件的父组件
ipadx 指定水平方向上的内边距
ipady 指定垂直方向上的内边距
padx 指定水平方向上的外边距
pady 指定垂直方向上的外边距
row 指定组件插入的行(0 表示第 1 行)
rowspan 指定用多少行(跨行)显示该组件
sticky 1. 控制组件在 grid 分配的空间中的位置 2. 可以使用 N, E, S, W 以及它们的组合来定位(EWSN代表东西南北,上北下南左西右东) 3. 使用加号(+)表示拉长填充,例如 N + S 表示将组件垂直拉长填充网格,N + S + W + E 表示填充整个网格 4. 不指定该值则居中显示

方法总结

Place

实例&分析

def test_place(master=None):
    lb1 = Label(master, text='hello Place', bg='blue')
    btn1 = Button(master, text="Click me", bg='yellow')

    # 绝对坐标位置
    lb1.place(x=200, y=200, anchor=NW)
    # 相对坐标位置 relx, rely
    btn1.place(relx=0.5, rely=0.5, anchor=CENTER)
    # 相对尺寸
    frm1 = Frame(master, bg='red')
    frm1.place(x=10, y=10, relheight=0.3, relwidth=0.3, anchor='nw')
    Label(frm1, bg="red").place(relx=0.5, rely=0.5, relheight=0.75, relwidth=0.75, anchor=CENTER)
    Label(frm1, bg="yellow").place(relx=0.5, rely=0.5, relheight=0.5, relwidth=0.5, anchor=CENTER)
    Label(frm1, bg="green").place(relx=0.5, rely=0.5, relheight=0.25, relwidth=0.25, anchor=CENTER)

    frm2 = Frame(master, bg='darkblue')
    frm2.place(x=300, y=300, relwidth=0.3, relheight=0.1, anchor='nw')
    lb2 = Label(frm2, text='hello world', fg='green')
    lb2.place(in_=frm2)

属性总结place(**options)

选项 含义
anchor 1. 控制组件在 place 分配的空间中的位置 2. N, NE, E, SE, S, SW, W, NW, 或 CENTER 来定位(EWSN代表东西南北,上北下南左西右东) 3. 默认值是 NW
bordermode 1. 指定边框模式(INSIDE 或 OUTSIDE) 2. 默认值是 INSIDE
height 指定该组件的高度(像素)
in_ 1. 将该组件放到该选项指定的组件中 2. 指定的组件必须是该组件的父组件
relheight 1. 指定该组件相对于父组件的高度 2. 取值范围 0.0 ~ 1.0
relwidth 1. 指定该组件相对于父组件的宽度 2. 取值范围 0.0 ~ 1.0
relx 1. 指定该组件相对于父组件的水平位置 2. 取值范围 0.0 ~ 1.0
rely 1. 指定该组件相对于父组件的垂直位置 2. 取值范围 0.0 ~ 1.0
width 指定该组件的宽度(像素)
x 1. 指定该组件的水平偏移位置(像素) 2. 如同时指定了 relx 选项,优先实现 relx 选项
y 1. 指定该组件的垂直偏移位置(像素) 2. 如同时指定了 rely 选项,优先实现 rely 选项

方法总结

Table of Contents