GUI布局管理器

目录

前言

一、pack布局管理器

二、grid布局管理器

三、place布局管理器


前言

一个GUI应用程序必然有大量的组件,这些组件如何排布?这时候,就需要使用tkinter提供的布局管理器帮助我们组织、管理在父组件中子组件的布局方式。tkinter提供了三种管理器:pack、grid、place。


 一、pack布局管理器

pack按照组件的创建顺序将子组件添加到父组件中,按照垂直或者水平的方向自然排布。如果不指定任何选项,默认在父组件中自顶向下垂直添加组件。

pack是代码量最少,最简单的一种,可以用于快速生成界面。

pack()方法提供的选项

选项说明取值范围
side定义停靠在父组件的哪一边上"top","bottom","left","right"(默认为top)
fill填充x/y方向上的空间,当side="top"/"bottom"时,填充x方向;当side="left"/"right"时,填充y方向;当expand选项为"yes"时,填充父组件的剩余空间"x","y","both","none"(默认值为none)
expand当值为"yes"时,side选项无效,组件显示在父配件中心位置;若fill选项为"both",则填充父组件的剩余空间从0开始的正整数

padx,pady

与之并列的组件之间的间隔,x方向或者y方向,默认单位是像素非负浮点数,默认0.0
ipadx,ipady设置子组件之间的间隔,x方向或者y方向,默认单位是像素非负浮点数,默认0.0
before将本组件于所选组件之前pack,类似于先创建本组件再创建选定组件已经pack后的组件对象

after

将本组件于所选组件之后pack,类似于先创建选定组件再创建本组件已经pack后的组件对象
in将本组件作为所选组件对象的子组件,类似于指定本组件的master为选定组件已经pack后的组件对象
anchor对齐方式"n","s","e","w","nw","sw","se","ne","center"(默认)

如上列出了pack布局所有的属性,但是不需要挨个熟悉,了解基本使用即可,pack适用于简单的垂直或水平分布,如果需要复杂的布局可以使用grid或place。

代码示例:

from tkinter import *
root = Tk();root.title("pack练习");root.geometry("300x300")
#Frame是一个矩形区域,可以用来放置其他子组件
f1=Frame(root,height=50);f1.pack();#垂直分布
btnText=['轻音乐','重金属','中国风']
for txt in btnText:
    Button(f1,text=txt).pack(side='left',padx=15)#水平分布
f2=Frame(root,height=250);f2.pack();#垂直分布
for i in range(0,15):
    if i%2==0:
        Label(f2,bg='black',height=250,width=2).pack(side='left')#水平分布
    else:
        Label(f2, bg='white', height=250, width=2).pack(side='left')  # 水平分布
root.mainloop()

运行结果:

二、grid布局管理器

grid表格布局,采用表格结构组织组件。子组件的位置由行和列的单元格来确定,并且可以跨行和跨列,从而实现复杂的布局。

grid()方法提供的选项

选项说明取值范围
row单元格的行号从0开始的正整数
rowspan跨越的行数正整数
column单元格的列号从0开始的正整数
columnspan跨越的列数正整数
padx,pady与之并列的组件之间的间隔非负浮点数,默认0.0
ipadx,ipady设置子组件之间的间隔非负浮点数,默认0.0
sticky组件紧贴所在单元格的某一角,对应于东南西北中以及4个角"n","s","e","w","nw","sw","se","ne","center"(默认)

代码示例:

from tkinter import *
class Application(Frame):
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.master = master
        self.pack()
        self.createWidgets()
    def createWidgets(self):
        self.label01=Label(self,text="姓名:")
        self.label01.grid(row=0,column=0)
        self.entry01=Entry(self)
        self.entry01.grid(row=0,column=1,padx=10)
        self.label02=Label(self,text="电话:")
        self.label02.grid(row=1,column=0)
        self.entry02 = Entry(self)
        self.entry02.grid(row=1, column=1,padx=10)
        self.button01 = Button(self,text="确定")
        self.button01.grid(row=2,column=0,columnspan=2,sticky=EW)
root=Tk()
root.title("first blood")
root.geometry("300x300+300+300")
app = Application(master=root)
root.mainloop()

运行结果:

  三、place布局管理器

place布局管理器可以通过坐标精确控制组件的位置,适用于一些布局更加灵活的场景。

place()方法提供的选项

选项说明取值范围
x,y组件相对于窗口左上角的绝对坐标非负整数(如果同时设置relx(rely)和x(y),那么place将优先计算relx和rely,然后再实现x和y指定的偏移值)
relx,rely组件相对于父容器左上角的坐标0~1
width,height组件的宽度和高度非负整数
relwidth,relheight组件相对于父组件的宽度和高度0~1
anchor对齐方式"n","s","e","w","nw","sw","se","ne","center"(默认)

代码示例:

from tkinter import *
root=Tk();root.geometry("300x300");root.title("明朝皇帝")
frame=Frame(root,bg="yellow",height=200,width=200);frame.place(x=50,y=50)
Button(frame,text="朱元璋").place(relx=0.35,rely=0.3,relwidth=0.3,relheight=0.1)
Button(frame,text="朱标").place(relx=0.35,rely=0.65,relwidth=0.3,relheight=0.1)
root.mainloop();

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值