Tkinter布局管理

TOC

Tkinter的布局方法

在我们日常的界面编写中,存在很多的组件,我们要像搭建积木的形式一样,将这些组件放到窗口界面的某个位置进行布局。
在Tkinter中提供了pack()guid()place()三个方法来进行布局

pack()方法

相对于其他方法,pack相对简单,能够快速地完成布局。
pack()方法的基本语法:

button = tk.Button(root, text="确定", command=test)
button.pack(**options)

pack()方法提供的选项:

选项参数 参数作用 取值范围
padx 参数设置指定组件与容器边缘的水平间距。 整数(像素单位)
pady 参数设置指定组件与容器边缘的垂直间距。 整数(像素单位)
ipadx 表达内部填充,增加按钮内容与边框的水平距离。 整数(像素单位)
ipady 表达内部填充,增加按钮内容与边框的垂直距离。 整数(像素单位)
side 组件停靠在父级的排列方式。 “top”(默认:由上往下排列、
“bottom”:由下往上排列、
“left”:由左往右排列、
“right”:由右往左排列
fill 控件是否填充可用空间。 “none”(默认)、“x”、“y”、“both”
expand 是否应该扩展以填充任何父容器中未被占用的空间(值为yes或者True时side无效) True 或 False(默认)
anchor (定位点) 控件在指定区域的对齐方式。 “NW”、“N” 、“NE”、“W”、“CENTER”(默认)、“E”、“SW”、“S”、“SE”

pack方法布局管理示例

1.默认的排列方式

from tkinter import *

# 创建窗口  
root = Tk()
root.geometry("500x200+500+300")
# 创建标签类型
lable1 = Label(root, text="红", bg="red")  
lable2 = Label(root, text="黄", bg="yellow")  
lable3 = Label(root, text="蓝", bg="blue")  
lable4 = Label(root, text="绿", bg="green")
root.title("pack 例子1 默认布局")
lable1.pack()
lable2.pack()
lable3.pack()
lable4.pack()
root.mainloop()

界面效果如下图所示:
tkinter

2.side参数排列方式

from tkinter import *

# 创建窗口  
root = Tk()
root.geometry("500x200+500+300")
# 创建标签类型
lable1 = Label(root, text="红", bg="red")  
lable2 = Label(root, text="黄", bg="yellow")  
lable3 = Label(root, text="蓝", bg="blue")  
lable4 = Label(root, text="绿", bg="green")
root.title("pack 例子2 side")
lable1.pack(side=TOP)
lable2.pack(side=BOTTOM)
lable3.pack(side=LEFT)
lable4.pack(side=RIGHT)
root.mainloop()

界面效果如下图所示:
tkinter

3.expand和fill布局方式

from tkinter import *

# 创建窗口  
root = Tk()
root.geometry("500x200+500+300")
# 创建标签类型
lable1 = Label(root, text="红", bg="red")  
lable2 = Label(root, text="黄", bg="yellow")  
lable3 = Label(root, text="蓝", bg="blue")  
lable4 = Label(root, text="绿", bg="green")
root.title("pack 例子3 expand和fill")
lable1.pack(side=TOP, fill=Y, expand=True)
lable2.pack(side=BOTTOM, fill=Y, expand=True)
lable3.pack(side=LEFT, fill=X, expand=True)
lable4.pack(side=RIGHT, fill=X, expand=True)
root.mainloop()

界面效果如下图所示:
tkinter

4.anchor参数示例

from tkinter import *

# 创建窗口  
root = Tk()
root.geometry("500x200+500+300")
# 创建标签类型
lable1 = Label(root, text="红", bg="red")
lable2 = Label(root, text="黄", bg="yellow")
lable3 = Label(root, text="蓝", bg="blue")
lable4 = Label(root, text="绿", bg="green")
root.title("pack 例子4 anchor")
lable1.pack(anchor=NW)
lable2.pack(anchor=NE)
lable3.pack(anchor=SW)
lable4.pack(anchor=SE)
root.mainloop()

界面效果如下图所示:
tkinter

5.side加上anchor并列方式

from tkinter import *

# 创建窗口  
root = Tk()
root.geometry("500x200+500+300")
# 创建标签类型
lable1 = Label(root, text="红", bg="red")
lable2 = Label(root, text="黄", bg="yellow")
lable3 = Label(root, text="蓝", bg="blue")
lable4 = Label(root, text="绿", bg="green")
root.title("pack 例子5 anchor")
lable1.pack(side=LEFT, anchor=NW)
lable2.pack(side=LEFT, anchor=NE)
lable3.pack(side=LEFT, anchor=SW)
lable4.pack(side=LEFT, anchor=SE)
root.mainloop()

界面效果如下图所示:
tkinter

6.展示有序间隔排列方式

from tkinter import *

# 创建窗口  
root = Tk()
root.geometry("500x200+500+300")
# 创建标签类型
lable1 = Label(root, text="红", bg="red")
lable2 = Label(root, text="黄", bg="yellow")
lable3 = Label(root, text="蓝", bg="blue")
lable4 = Label(root, text="绿", bg="green")
root.title("pack 例子6 间隔")
lable1.pack(padx=20, pady=10, ipadx=10, ipady=5)
lable2.pack(padx=20, pady=10, ipadx=10, ipady=5)
lable3.pack(padx=20, pady=10, ipadx=10, ipady=5)
lable4.pack(padx=20, pady=10, ipadx=10, ipady=5)
root.mainloop()

界面效果如下图所示:
tkinter

guid()方法

guid方法基于行和列的网格布局管理方式,相对复杂的界面设计会有用
guid()方法的基本语法:

button = tk.Button(root, text="确定", command=test)
button.guid(**options)

guid()方法提供的选项:

选项参数 参数作用 取值范围
row 组件所在行的位置。 整数
column 组件所在列的位置。 整数
rowspan 组件跨越的行数。 整数,占用行数的数量
columnspan 组件跨越的列数。 整数,占用列数的数量
sticky 控件在单元格内的对齐方式。 功能类似anchor,但是只可以设定N/S/W/E,即上/下/左/右对齐.

sticky=N+S
:可以拉长高度让控件在顶端和底端对齐。
sticky=W+E
:可以拉长宽度让控件在左边和右边对齐。
sticky=N+S+E
:可以拉长高度让控件在顶端和底端对齐,同时切齐右边。
sticky=N+S+W
:可以拉长高度让控件在顶端和底端对齐,同时切齐左边。
sticky=N+S+W+E
:可以拉长高度让控件在顶端和底端对齐,同时切齐左右边
padx 参数设置指定组件与容器边缘的水平间距。 整数(像素单位)
pady 参数设置指定组件与容器边缘的垂直间距。 整数(像素单位)
ipadx 表达内部填充,增加按钮内容与边框的水平距离。 整数(像素单位)
ipady 表达内部填充,增加按钮内容与边框的垂直距离。 整数(像素单位)

1.guid默认排列方式

from tkinter import *

# 创建窗口  
root = Tk()
root.geometry("500x200+500+300")
# 创建标签类型
lable1 = Label(root, text="红12", bg="red")  
lable2 = Label(root, text="黄1234", bg="yellow")  
lable3 = Label(root, text="蓝123456", bg="blue")  
lable4 = Label(root, text="绿12345678", bg="green")
root.title("grid 例子1 默认布局")
lable1.grid()
lable2.grid()
lable3.grid()
lable4.grid()
root.mainloop()

界面效果如下图所示:
tkinter

2.指定行列的排列方式

from tkinter import *

# 创建窗口  
root = Tk()
root.geometry("500x200+500+300")
# 创建标签类型
lable1 = Label(root, text="红12", bg="red")  
lable2 = Label(root, text="黄1234", bg="yellow")  
lable3 = Label(root, text="蓝123456", bg="blue")  
lable4 = Label(root, text="绿12345678", bg="green")
root.title("grid 例子2 指定行列")
lable1.grid(row=0, column=0)
lable2.grid(row=2, column=0)
lable3.grid(row=3, column=3)
lable4.grid(row=4, column=3)
root.mainloop()

界面效果如下图所示:
tkinter

3.使用sticky参数排列方式

from tkinter import *

# 创建窗口  
root = Tk()
root.geometry("500x200+500+300")
# 创建标签类型
lable1 = Label(root, text="红12", bg="red")  
lable2 = Label(root, text="黄1234", bg="yellow")  
lable3 = Label(root, text="蓝123456", bg="blue")  
lable4 = Label(root, text="绿12345678", bg="green")
root.title("grid 例子3 sticky")
lable1.grid(row=0, column=0, sticky=EW)
lable2.grid(row=2, column=0)
lable3.grid(row=3, column=3, sticky=EW)
lable4.grid(row=4, column=3)
root.mainloop()

界面效果如下图所示:
tkinter

4.使用columnspan参数的排列方式

from tkinter import *

# 创建窗口  
root = Tk()
root.geometry("500x200+500+300")
# 创建标签类型
lable1 = Label(root, text="红12", bg="red")  
lable2 = Label(root, text="黄1234", bg="yellow")  
lable3 = Label(root, text="蓝123456", bg="blue")  
lable4 = Label(root, text="绿12345678", bg="green")
root.title("grid 例子4 columnspan")
lable1.grid(row=0, column=0, sticky=EW)
lable2.grid(row=0, column=1, sticky=EW)
lable3.grid(row=1, column=0, columnspan=2, sticky=EW)
lable4.grid(row=2, column=0, sticky=EW)
root.mainloop()

界面效果如下图所示:
tkinter

place()方法

place则是提供相对位置和绝对位置的精确控制,也同样适应于复杂的布局管理。
guid()方法的基本语法:

button = tk.Button(root, text="确定", command=test)
button.place(**options)

place()方法提供的选项:

选项参数 参数作用 取值范围
x 组件相对于父级容器的水平偏移量,表示控件的横坐标。 整数(像素单位)
y 组件相对于父级容器的垂直偏移量,表示控件的纵坐标。 整数(像素单位)
width 组件的宽度。 整数(像素单位)
height 组件的高度。 整数(像素单位)
anchor (定位点) 控件在指定区域的对齐方式,用于指定组件如何对齐于 (x, y) 点。 “NW”、“N” 、“NE”、“W”、“CENTER”(默认)、“E”、“SW”、“S”、“SE”
relx 组件的水平位置,相对于父容器的宽度的比例。 浮动值,范围 0 到 1
rely 组件的垂直位置,相对于父容器的高度的比例。 浮动值,范围 0 到 1
relwidth 控件的宽度,相对于父容器宽度的比例。 浮动值,范围 0 到 1
relheight 控件的高度,相对于父容器高度的比例。 浮动值,范围 0 到 1

相比pack和guid方法来说place太精准了,所以还是pack和guid方法使用起来更加友善。