文章目录
简介
在设计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)
运行结果:
谢谢观看,笔者会持续更新,如有错误或者建议,请私信我