3.2.3.2 grid

grid布局管理采用类似表格的结构来管理控件的,使用起来非常灵活。就是把窗口用单元格的形式来定位,可以像编辑表格一样放置控件。grid采用行列确定位置,行列交汇处为一个单元格。每一列中,列宽由这一列中最宽的单元格确定。每一行中,行高由这一行中最高的单元格决定。控件并不是充满整个单元格的,你可以指定单元格中剩余空间的使用。你可以空出这些空间,也可以在水平或竖直或两个方向上填满这些空间。也可以连接若干个单元格为一个更大空间, 这一操作被称作跨越(span),与excel的合并单元格是一个概念。使用grid的布局方法的时候,单元格必须是紧邻创建的。
3.2.3.2.1 grid选项

名称描述取值范围
column控件所置单元格的列号。自然数(起始默认值为0,往后累加)
columnspan从控件所置单元格算起在列方向上的跨度。自然数(起始默认值为0)
ipadx, ipady控件内部在x(y)方向上填充的空间大小,默认单位为像素,可选单位为c(厘米)、m(毫米)、i(英寸)、p(打印机的点,即1/27英寸),用法为在值后加以上一个后缀既可。非负浮点数(默认值为0.0)
padx, pady控件外部在x(y)方向上填充的空间大小,默认单位为像素,可选单位为c(厘米)、m(毫米)、i(英寸)、p(打印机的点,即1/27英寸),用法为在值后加以上一个后缀既可。非负浮点数(默认值为0.0)
row控件所置单元格的行号。自然数(起始默认值为0,往后累加)
rowspan从控件所置单元格算起在行方向上的跨度。自然数(起始默认值为0)
in_将本控件作为所选组建对象的子控件,类似于指定本控件的master为选定控件。已经显示的控件对象
sticky控件紧靠所在单元格的某一边角。‘n’,‘s’,‘w’,‘e’,‘nw’, ‘sw’,‘se’,‘ne’,‘center’(默认为’center’)

有些选项的用法在pack布局方法中已经介绍过了。他们在grid布局方法中也有,而且是一样的:
padx, pady,ipadx,ipady,in_
这些选项就不在grid布局方法中再次赘述了。

  • row 和 column

顾名思义就是用行与列来定义控件摆放的位置。

import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1 = tk.Label(root,text='文本1')
b1.grid(row=0,column=0)
b2 = tk.Label(root,text='文本2')
b2.grid(row=1 ,column=0)
b3 = tk.Label(root,text='文本3')
b3.grid(row=0,column=1)
root.mainloop()

结果:
在这里插入图片描述
说明:
第一行,第一列定义的是标签b1,第一行,第二列定义的是标签b3
第二行,第一列定义的是标签b2。

默认的显示是居左,并且不用按顺序说明控件。但是不能有错,比如两个控件在一个单元格内是不可以的。比如把b1和b3都定义在第一行、第一列,那么就会显示后面声明的。
在这里插入图片描述
最先定义的标签b1,消失了。这是因为b1和b3重叠了。

  • rowspan和columnspan

这两个的功能是分别实现跨行与跨列的功能。其实和excel中的跨单元格的方法是一样的。

import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1 = tk.Label(root,text='跨\n两\n列',bg='blue')
b1.grid(row=0,column=0,rowspan=2)
b2 = tk.Label(root,text='跨两行',bg='yellow')
b2.grid(row=0 ,column=1,columnspan=2)
b3 = tk.Label(root,text='文本3',bg='cyan')
b3.grid(row=1,column=1)
b4 = tk.Label(root,text='文本4',bg='cyan')
b4.grid(row=1,column=2)
root.mainloop()

结果:
在这里插入图片描述

  • sticky

与pack的anchor方法类似,也是有八个方向。主要是定义控件在单元格内靠向那一边。比如,左边、右边还是中间。
上一个例子中,标签’跨两行’是居中显示的。我们可以让它靠左。这就要使用sticky

import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1 = tk.Label(root,text='跨\n两\n列',bg='blue')
b1.grid(row=0,column=0,rowspan=2)
b2 = tk.Label(root,text='跨两行',bg='yellow')
b2.grid(row=0 ,column=1,columnspan=2,sticky='w')
b3 = tk.Label(root,text='文本3',bg='cyan')
b3.grid(row=1,column=1)
b4 = tk.Label(root,text='文本4',bg='cyan')
b4.grid(row=1,column=2)
root.mainloop()

结果:
在这里插入图片描述
3.2.3.2.2 grid 函数

函数名描述
grid_slaves()以列表方式返回本控件的所有子控件对象。
grid_propagate(boolean)设置为True表示父控件的几何大小由子控件决定(默认值),反之则无关。
grid_info()返回提供的选项所对应的值。
grid_forget()将控件隐藏并且忽略原有设置,对象依旧存在,可以用grid(option, …),将其显示。
grid_remove ()和grid_forget()类似。不过会记住当前的选项。重新.grid之后,会使用当前的选项。
grid_location(x, y)设定控件在屏幕中相对于容纳单元的(x,y)坐标,并返回grid系统中的哪个单元包含了该坐标(column,row)。
grid_bbox(column=None, row=None, col2=None, row2=None)返回一个有四个元素的元组,用来描述控件内一些或者全部单元的边界。返回的前两个数为左上方区域的x,y坐标,后两个数为宽度和高度。 如果只传递了 column 和 row 参数,返回的参数描述的是该行列的单元的大小。如果传递了 col2 和 row2 参数,返回的参数描述的就是从 column 列 到 col2 列,以及从 row 行 到 row2 行总体区域的大小。
grid_rowconfigure(index, **options)设定行属性。见行属性设定表
grid_columnconfigure(index, **options)设置列属性。见列属性设定表

表:行属性设定表

选项含义
minsize指定该行的最小高度
pad指定该行中最大网格的垂直边距
weight指定行于行之间的相对距离,认值是0

表:列属性设定表

选项含义
minsize指定该列的最小高度
pad指定该列中最大网格的水平边距
weight指定列与列之间的相对距离,默认值是0。说明:初创建窗口的时候,grid会自动根据控件的尺寸分配窗口的尺寸,当你拉伸窗口的尺寸就会有空白显示出来。这个选项正是指定列与列之间是否填充空白,默认是不填充的。另外,该选项的值是指定填充空白的倍数,例如weight=2的列会比weight=1的列填充多一倍的空白,所以需要平均填充的话,只需要所有的列都设置为weight=1即可
grid 的函数与pack类似,比如:grid_slaves(),grid_propagate(),grid_info(),grid_forget()都是一样的。

grid_remove()的功能是与grid_forget类似。唯一的区别就是保留了当前控件的配置选项,在重新显示的时候,会使用当前的选项。而grid_forget()则必须重新设置。

  • grid_location(x,y)

为了更好的说明函数的作用,在代码中使用了Canvas控件。

import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1 = tk.Canvas(root,bg='blue',width=40,height=80)
b1.grid(row=0,column=0,rowspan=2)
b2 = tk.Canvas(root,bg='yellow',width=80,height=40)
b2.grid(row=0 ,column=1,columnspan=2)
b3 = tk.Canvas(root,bg='cyan',width=40,height=40)
b3.grid(row=1,column=1)
b4 = tk.Canvas(root,bg='gray',width=40,height=40)
b4.grid(row=1,column=2)
i=30
j=120
m = root.grid_location(i,j)
print("i=",i,"j=",j,m)
root.mainloop()

结果:
在这里插入图片描述
元组m的值是(0,2)。意味着(30,120)在第一行,第三列上。调整i,j的值,可以得到不同的单元格。

  • grid_bbox()

这个函数就是返回控件中的单元格边框。一共有四个参数。就是指定起始的行、列(比如0,0表示第一行、第一列),以及结束的行列。需要注意的一点是,需要在mainloop()之后调用才有正确的结果。比如,本例就是在按钮的回调函数中,调用的grid_bbox。

import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
t = tk.Frame(root)
t.grid(row=0,column=0)
b1 = tk.Canvas(t,bg='blue',width=40,height=80)
b1.grid(row=0,column=0,rowspan=2)
b2 = tk.Canvas(t,bg='yellow',width=80,height=40)
b2.grid(row=0 ,column=1,columnspan=2)
b3 = tk.Canvas(t,bg='cyan',width=40,height=40)
b3.grid(row=1,column=1)
b4 = tk.Canvas(t,bg='gray',width=40,height=40)
b4.grid(row=1,column=2)
def bbox():
    print(t.grid_bbox(0,0,1,1))
b5 = tk.Button(t,text='bbox',command=bbox)
b5.grid(row=2,column=0)
root.mainloop()

结果:
在这里插入图片描述

  • grid_rowconfigure()与grid_columnconfigure()

用来指定行列的属性。详细的说明见上表。这里不再重复。如果要充满整个单元格,需要用这两个函数。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐