鱼c笔记——Python 的 GUI 编程(十六):Tkinter 的三大布局管理器 pack、grid 和 place

什么是布局管理器:管理我们组件如何排列的东西

 

Tkinter 为我们提供了三个布局管理器:pack, grid 和 place

pack, grid 和 place 均用于管理同在一个父组件下的所有组件的布局,其中:

pack 是按添加顺序排列组件

grid 是按行列形式排列组件

place 则允许程序员指定组件的大小和位置

目录

何时使用pack管理器?

何时使用grid管理器?

如何使用place管理器:

pack的方法

pack(**options)

pack_configure(**options)

pack_forget()

pack_info()

pack_propagate(flag)

pack_slaves()

grid的方法:

grid(**options)

grid_bbox(column=None, row=None, col2=None, row2=None)

grid_columnconfigure(index, **options)

grid_configure(**options)

grid_forget()

grid_info()

grid_location(x, y)

grid_propagate(flag)

grid_remove()

grid_rowconfigure(index, **options)

grid_size()

grid_slaves(row=None, column=None)

place的方法

place(**options)

place_configure(**options)

place_forget()

place_info()

place_slaves()

slaves()


何时使用pack管理器?

对比 grid 管理器,pack 更适用于少量组件的排列,但它在使用上更加简单(就像前面的所有例子中,展示一个组件我们一般都直接使用 .pack() 方法)。如果你需要创建相对复杂的布局结构,那么建议是使用多个框架(Frame)结构构成,或者使用 grid 管理器实现。

注意:不要在同一个父组件中混合使用 pack() 和 grid(),因为 Tkinter 无法确定首先使用哪个布局管理器。


我们常常会遇到的一种情况是将一个组件放到一个容器组件中,并填充整个父组件。下面举个生成一个 Listbox 组件并将它填充到 root 窗口中:

from tkinter import *

root = Tk()

listbox = Listbox(root)
listbox.pack(fill=BOTH, expand=True)
#fill选项是填充整个父组件,expand选项是拉伸时依旧填满

for i in range(10):
    listbox.insert(END, str(i))

mainloop()

其中,fill 选项是告诉窗口管理器该组件将填充整个分配给它的空间,BOTH 表示同时横向和纵向扩展,X 表示横向,Y 表示纵向。expand 选项是告诉窗口管理器将父组件的额外空间也充满。


默认下,pack 是将添加的组件一次纵向排列

from tkinter import *

root = Tk()

Label(root, text='red', bg='red', fg='white').pack(fill=X) #fill选项是设置横向填充
Label(root, text='red', bg='green', fg='black').pack(fill=X)
Label(root, text='red', bg='blue', fg='white').pack(fill=X)
#整体是纵向填充

#Label(root, text='red', bg='red', fg='white').pack(side=LEFT) 如果想将组件整体横向排列,可以设置side选项

mainloop()

何时使用grid管理器?

grid 管理器可以说是 Tkinter 这三个布局管理器中最灵活多变的。如果你只希望学习使用一个布局管理器,那么 grid 绝对是首选。当你在设计对话框的时候,使用 grid 尤其便捷。使用一个 grid 就可以简单的实现你用很多个框架和 pack 搭建起来的效果。


使用 grid 排列组件,只要告诉它你想要组件放置的位置(行 / 列,row 选项指定行,column 选项指定列)。此外你并不用提前指出网格(grid 分布给组件的位置称为网格)的尺寸,因为管理器会自动计算。

 

设置一个简单的登录界面:

from tkinter import *

root = Tk()

Label(root, text='用户名').grid(row=0, column=0, sticky=W)  #sticky选项设置组件朝向
Label(root, text='密码').grid(row=1, column=0, sticky=W)

Entry(root).grid(row=0, column=1)
Entry(root, show='*').grid(row=1, column=1)

mainloop()

用几个网格来放置一个组件,可以使用 rowspan 和 columnspan 实现跨行跨列的功能:

from tkinter import *

root = Tk()

Label(root, text='用户名').grid(row=0, column=0, sticky=W)
Label(root, text='密码').grid(row=1, column=0, sticky=W)

photo = PhotoImage(file=r"D:\u.gif")  #只能是.gif格式
Label(root, image=photo).grid(row=0, column=2, rowspan=2, padx=5, pady=5)  #rowspan选项设置了跨行,现在photo组件可以显示0,1两行了。padx,pady设置了边距,使图片文字不挨在一起

Entry
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值