tkinter-grid布局详解

前文tkinter-pack布局详解介绍了pack布局,相信对tkinter的布局套路有了一定的了解。本文将介绍另一种布局类grid。

同样,展示布局类与控件类的类间关系:
在这里插入图片描述

grid

grid从字面意思上可以推断,这种布局方式就像网格一样来分布控件。那么具体会呈现什么样的效果,要怎么编码控制呢。同样的套路,通过实例来进行直观的讲解。

widget.grid(cnf={}, **kw)

默认分布

from tkinter import (Tk, Button)
from tkinter.constants import RIGHT, LEFT, X, Y, BOTH

main_win = Tk()
main_win.title('渔道的pack布局')
width = 300 
height = 300 
main_win.geometry(f'{width}x{height}')
# print(main_win.keys())

apple_color = 'Crimson'
banana_color = 'Yellow'
orange_color = 'Orange'
grape_color = 'Purple'

fruit = {'apple':'Crimson', 'banana':'Yellow', 'orange':'Orange', 'grape':'Purple'}

# 默认显示效果
for k,v in fruit.items():
    bt = Button(main_win, text=k, fg='black', bg=v)
    bt.grid()
    print(bt.grid_info())

main_win.mainloop()

print函数的打印信息如下:

在这里插入图片描述

可以看出4个按钮默认分布在第0列(column属性),然后依次分布在第0-3行(row属性),列间隔(columnspan)为1,行间隔(rowspan)为1,sticky属性相当于pack的anchor属性但是不完全相同,后面会具体讲解。
在这里插入图片描述

从上面的例子可以看出,使用grid布局时,可以想象,在主窗口上 隐式的布满网格(cell),子控件(如,按钮)就会被放在这些网格中。

column

指定控件所在的列

i = 0
for k,v in fruit.items():
    bt = Button(main_win, text=k, fg='black', bg=v)
    bt.grid(column=i)
    i += 1
    print(bt.grid_info())

print函数打印信息如下:
在这里插入图片描述

从打印信息中可以看出,apple在第0列第0行;banana在第1列第1行;orange在第2列第2行;grape在第3列第3行。下图的实际呈现效果和打印中的行列信息一致。
在这里插入图片描述

row

指定控件所在的行

i = 0
for k,v in fruit.items():
    bt = Button(main_win, text=k, fg='black', bg=v)
    bt.grid(row=0, column=i)
    i += 1
    print(bt.grid_info())

print函数打印信息如下:
在这里插入图片描述

代码中,我将4个按钮的行都指定为第0行,那么,这四个按钮应该是在第0行紧挨着排列,我们来看下实际效果:
在这里插入图片描述

columnspan

指定每个控件横跨的列数

i = 0
for k,v in fruit.items():
    bt = Button(main_win, text=k, fg='black', bg=v)
    bt.grid(column=i, columnspan=3)
    i += 1
    print(bt.grid_info())

print函数打印信息如下:
在这里插入图片描述

代码中,我将4个按钮的columnspan都指定为3,那么,每个按钮应该是横跨3列,我们来看下实际效果:
在这里插入图片描述

rowspan

指定每个控件横跨的行数

i = 0
for k,v in fruit.items():
    bt = Button(main_win, text=k, fg='black', bg=v)
    bt.grid(column=i, rowspan=3)
    i += 1
    print(bt.grid_info())

print函数打印信息如下:
在这里插入图片描述

代码中,我将4个按钮的rowspan都指定为3,那么,每个按钮应该是横跨3列,从上面的打印信息中其实可以判断,每个按钮都横跨了3行,我们来看下实际效果:
在这里插入图片描述

ipadx

水平方向内边距

for k,v in fruit.items():
    bt = Button(main_win, text=k, fg='black', bg=v)
    bt.grid()
    print(bt.grid_info())

for k,v in fruit.items():
    bt = Button(main_win, text=k, fg='black', bg=v)
    bt.grid(ipadx=20)
    print(bt.grid_info())

在这里插入图片描述

ipady

垂直方向内边距

for k,v in fruit.items():
    bt = Button(main_win, text=k, fg='black', bg=v)
    bt.grid()
    print(bt.grid_info())

for k,v in fruit.items():
    bt = Button(main_win, text=k, fg='black', bg=v)
    bt.grid(ipady=20)
    print(bt.grid_info())

在这里插入图片描述

padx

水平方向外边距

i = 1
for k,v in fruit.items():
    bt = Button(main_win, text=k, fg='black', bg=v)
    if i%2 == 0:
        bt.grid(padx=20, column=1)
    else:
        bt.grid(padx=20)
    i += 1
    print(bt.grid_info())

在这里插入图片描述

pady

垂直方向外边距

i = 1
for k,v in fruit.items():
    bt = Button(main_win, text=k, fg='black', bg=v)
    if i%2 == 0:
        bt.grid(pady=20, column=1)
    else:
        bt.grid(pady=20)
    i += 1
    print(bt.grid_info())

在这里插入图片描述

sticky

sticky类似于pack的anchor,决定控件在cell中锚点,也就是控件在cell中的起始位置,可设置的值为’n’, ‘ne’, ‘e’, ‘se’, ‘s’, ‘sw’, ‘w’, ‘nw’; ‘e’、‘w’、‘s’、'n’分别表示东西南北。

for k,v in fruit.items():
    bt = Button(main_win, text=k, fg='black', bg=v)
    bt.grid()
    print(bt.grid_info())

for k,v in fruit.items():
    bt = Button(main_win, text=k, fg='black', bg=v)
    bt.grid(sticky='nw')
    print(bt.grid_info())

在第二组按钮中,将sticky设置为’nw’,也就是以cell的左上方为起始显示。
在这里插入图片描述

好了,grid的属性就介绍到这里。是不是非常简单呢!

  • 46
    点赞
  • 192
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sif_666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值