简介

在设计GUI程序时,可以使用三种方法包装和定位各组件在容器窗口内的位置
这三种方法又称窗口控件配置管理员(Widget Layout Manager)

  • pack 方法
  • grid 方法
  • place 方法
grid方法

这是一种以格状或者类似Excel电子表格方式包装和定位窗口组件的方法。

语法如下:

grid(options, ...)

它的参数有row, column, padx/pady, rowspan, columnspan, sticky

row 和 column

在这里插入图片描述
例子:使用grid()方法替代pack()方法重新设计

import tkinter

# 创建主窗口
root = tkinter.Tk()
label1 = tkinter.Label(root, text="One",
                      bg="lightyellow",
                       width=15)
label2 = tkinter.Label(root, text="Two",
                      bg="lightblue",
                       width=15)
label3 = tkinter.Label(root, text="Three",
                      bg="lightgreen",
                       width=15)
label1.grid(row=0, column=0)
label2.grid(row=0, column=1)
label3.grid(row=1, column=0)
root.mainloop()

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

例子

label1.grid(row=0, column=0)
label2.grid(row=2, column=1)
label3.grid(row=1, column=2)

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

columnspan 参数

可以设定控件在column方向的合并数量

我们先用grid()方法建立一个含有8个标签的应用

例子:

import tkinter

# 创建主窗口
root = tkinter.Tk()
label1 = tkinter.Label(root, text="One", relief="raised", width=5)
label2 = tkinter.Label(root, text="Two", relief="raised", width=5)
label3 = tkinter.Label(root, text="Three", relief="raised", width=5)
label4 = tkinter.Label(root, text="Four", relief="raised", width=5)
label5 = tkinter.Label(root, text="Five", relief="raised", width=5)
label6 = tkinter.Label(root, text="Six", relief="raised", width=5)
label7 = tkinter.Label(root, text="Seven", relief="raised", width=5)
label8 = tkinter.Label(root, text="Eight", relief="raised", width=5)
label1.grid(row=0, column=0)
label2.grid(row=0, column=1)
label3.grid(row=0, column=2)
label4.grid(row=0, column=3)
label5.grid(row=1, column=0)
label6.grid(row=1, column=1)
label7.grid(row=1, column=2)
label8.grid(row=1, column=3)
root.mainloop()

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

现在我们想把二和三给重合,就要用到columnspan参数
例子

import tkinter

# 创建主窗口
root = tkinter.Tk()
label1 = tkinter.Label(root, text="One", relief="raised", width=5)
# 注意,这里修改了宽度为10像素
label2 = tkinter.Label(root, text="Two", relief="raised", width=10)
# label3 = tkinter.Label(root, text="Three", relief="raised", width=5)
label4 = tkinter.Label(root, text="Four", relief="raised", width=5)
label5 = tkinter.Label(root, text="Five", relief="raised", width=5)
label6 = tkinter.Label(root, text="Six", relief="raised", width=5)
label7 = tkinter.Label(root, text="Seven", relief="raised", width=5)
label8 = tkinter.Label(root, text="Eight", relief="raised", width=5)
label1.grid(row=0, column=0)
label2.grid(row=0, column=1, columnspan=2)
# label3.grid(row=0, column=2)
label4.grid(row=0, column=3)
label5.grid(row=1, column=0)
label6.grid(row=1, column=1)
label7.grid(row=1, column=2)
label8.grid(row=1, column=3)
root.mainloop()

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

rowspan 参数

可以设定控件在row方向的合并数量

例子

import tkinter

# 创建主窗口
root = tkinter.Tk()
label1 = tkinter.Label(root, text="One", relief="raised", width=5)
label2 = tkinter.Label(root, text="Two", relief="raised", width=5)
label3 = tkinter.Label(root, text="Three", relief="raised", width=5)
label4 = tkinter.Label(root, text="Four", relief="raised", width=5)
label5 = tkinter.Label(root, text="Five", relief="raised", width=5)
# label6 = tkinter.Label(root, text="Six", relief="raised", width=5)
label7 = tkinter.Label(root, text="Seven", relief="raised", width=5)
label8 = tkinter.Label(root, text="Eight", relief="raised", width=5)
label1.grid(row=0, column=0)
label2.grid(row=0, column=1, rowspan=2)
label3.grid(row=0, column=2)
label4.grid(row=0, column=3)
label5.grid(row=1, column=0)
# label6.grid(row=1, column=1)
label7.grid(row=1, column=2)
label8.grid(row=1, column=3)
root.mainloop()

运行结果:
在这里插入图片描述
例子

import tkinter

# 创建主窗口
root = tkinter.Tk()
label1 = tkinter.Label(root, text="One", relief="raised", width=5)
label2 = tkinter.Label(root, text="Two", relief="raised", width=5)
# label3 = tkinter.Label(root, text="Three", relief="raised", width=5)
label4 = tkinter.Label(root, text="Four", relief="raised", width=5)
label5 = tkinter.Label(root, text="Five", relief="raised", width=5)
# label6 = tkinter.Label(root, text="Six", relief="raised", width=5)
# label7 = tkinter.Label(root, text="Seven", relief="raised", width=5)
label8 = tkinter.Label(root, text="Eight", relief="raised", width=5)
label1.grid(row=0, column=0)
label2.grid(row=0, column=1, rowspan=2)
# label3.grid(row=0, column=2)
label4.grid(row=0, column=3)
label5.grid(row=1, column=0)
# label6.grid(row=1, column=1)
# label7.grid(row=1, column=2)
label8.grid(row=1, column=3)
root.mainloop()

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

sticky参数

这个参数的功能类似anchor,但是只可以设定N/S/W/E,即上/下/左/右对齐
原则上相同column的Widget 控件,如果宽度不同的话,grid方法会保留最宽的控件当做基准,这时比较短的件会居中对齐。

例子:相同column 中的Widget 控件宽度不同,控件内容会居中对齐

import tkinter

# 创建主窗口
root = tkinter.Tk()
label1 = tkinter.Label(root, text="One")
label2 = tkinter.Label(root, text="TwoTwoTwo", width=10)
label1.grid(row=0, column=0)
label2.grid(row=1, column=0)
root.mainloop()

运行结果:
在这里插入图片描述
可以看到One是根据TwoTwoTwo居中对齐的

例子:使One标签靠左对齐

import tkinter

# 创建主窗口
root = tkinter.Tk()
label1 = tkinter.Label(root, text="One")
label2 = tkinter.Label(root, text="TwoTwoTwo", width=10)
label1.grid(row=0, column=0, sticky=tkinter.W)
label2.grid(row=1, column=0)
root.mainloop()

运行结果:
在这里插入图片描述
sticky的参数可以组合使用

参数含义
sticky=N+S可以拉长高度,让控件在顶端和底端对齐
sticky=W+E可以拉长宽度,让控件在左边和右边对齐
sticky=N+S+E可以拉长高度,让控件在顶端和底端对齐,同时切齐右边
sticky=N+S+W可以拉长高度,让控件在顶端和底端对齐,同时切齐左边
sticky=N+S+W+E可以拉长高度,让控件在顶端和底端对齐,同时切齐左右边

例子:使用relief="raised"增加外观,同时让控件在左边和右边对齐

import tkinter

# 创建主窗口
root = tkinter.Tk()
label1 = tkinter.Label(root, text="One", relief="raised")
label2 = tkinter.Label(root, text="TwoTwoTwo", relief="raised")
label1.grid(row=0, column=0, sticky=tkinter.W + tkinter.E)
label2.grid(row=1, column=0)
root.mainloop()

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

grid 方法的应用

例子:建立色彩标签

import tkinter

colors = ["red", "yellow", "green", "blue", "purple"]

rows = 0
# 创建主窗口
root = tkinter.Tk()
for color in colors:
    tkinter.Label(root, text=color, relief="raised", width=15).grid(row=rows, column=0)
    tkinter.Label(root, bg=color, relief="raised", width=15).grid(row=rows, column=1)
    rows += 1

root.mainloop()

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

rowconfigure() 和 columnconfigure()

在设计控件的布局时,有时候会碰上窗口缩放大小,此时可以使用这两个方法设定第几行row或者是column的缩放比例

"""row 0的控件当窗口改变大小时,缩放比例是1"""
rowconfigure(0, weight=1)
"""column 0的控件当窗口改变大小时,缩放比例是1"""
columnconfigure(0, weight=1)

例子

import tkinter

# 创建主窗口
root = tkinter.Tk()
root.rowconfigure(1, weight=1)
root.columnconfigure(0, weight=1)
label1 = tkinter.Label(root, text="Label 1", bg="red")
label1.grid(row=0, column=0)
label2 = tkinter.Label(root, text="Label 2", bg="blue")
label2.grid(row=0, column=1)
label3 = tkinter.Label(root, text="Label 3", bg="green")
label3.grid(row=1, column=0, columnspan=2)
root.mainloop()

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

例子:增加sticky,让其可以切齐左边对齐,也让下方的标签可以对齐上、下、左、右边

import tkinter

# 创建主窗口
root = tkinter.Tk()
root.rowconfigure(1, weight=1)
root.columnconfigure(0, weight=1)

label1 = tkinter.Label(root, text="Label 1", bg="red")
label1.grid(row=0, column=0, padx=5, pady=5, sticky=tkinter.W)

label2 = tkinter.Label(root, text="Label 2", bg="blue")
label2.grid(row=0, column=1, padx=5, pady=5)

label3 = tkinter.Label(root, text="Label 3", bg="green")
label3.grid(row=1, column=0, columnspan=2, padx=5, pady=5, sticky=tkinter.N+tkinter.S+tkinter.W+tkinter.E)

root.mainloop()

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

例子:

label1.grid(row=0, column=0, padx=5, pady=5, sticky=tkinter.W+tkinter.E)

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

谢谢观看,笔者会持续更新,如有错误或者建议,请私信我

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐