使用tkinter开发GUI程序2 -- 窗口组件配置管理Layout Management

本文详细介绍了Tkinter GUI编程中的三种布局管理方法:pack()、grid()和place()。pack()方法简单易用,按照顺序自上而下排列控件;grid()采用表格布局,适合精确定位;place()则允许绝对或相对定位,适配窗口大小变化。通过实例展示了每种方法的使用和参数设置,帮助理解控件在窗口中的布局策略。
摘要由CSDN通过智能技术生成

窗口组件配置管理又可以说是控件布局,控件布局通常有pack()、grid()和place()三种方法。

1.pack()方法

方法pack()是一种简单的布局方法,如果用不加参数的默认方式,将按布局语句的先后,以最小占用空间的方式自上而下地排列控件实例,并且保持控件本身的最小尺寸。

用pack()方法不加参数排列标签。为看清楚各控件实例所占用的空间大小,文本使用了不同长度的中英文,并设置relief=GROOVE的凹陷边缘属性。

from tkinter import *

window = Tk()
label_red = Label(window, text='Red', fg='red', relief=GROOVE)
label_red.pack()
label_green = Label(window, text='绿色', fg='green', relief=GROOVE)
label_green.pack()
label_blue = Label(window, text='蓝', fg='blue', relief=GROOVE)
label_blue.pack()

window.mainloop()

使用pack()方法可设置fill、side等属性参数。其中,参数fill可取值:fill=X,fill=Y或fill=BOTH,分别表示允许控件实例向水平方向、垂直方向或二维伸展填充父容器未被占用的空间。

参数side可取值:side=TOP(默认),side=LEFT,side=RIGHT,side=BOTTOM,分别表示本控件实例的布局相对于下一个控件实例的方位。另外,使用pack()方法时,窗口组件间的距离是1像素,如果希望有适度间距,可以增加参数padx/pady,代表水平间距、垂直间距,可以分别在组件间增加间距。

from tkinter import *

window = Tk()
label_red = Label(window, text='Red', fg='red', relief=GROOVE)
label_red.pack()
label_green = Label(window, text='绿色', fg='green', relief=GROOVE)
label_green.pack(side=RIGHT)
label_blue = Label(window, text='蓝', fg='blue', relief=GROOVE)
label_blue.pack(fill=X)

window.mainloop()

2.grid()方法

grid()是一种以格状(可想成是Excel电子表格)包装和定位窗口组件的方法。方法grid()是基于网格的布局,先虚拟一个二维表格,再在该表格中布局控件实例。由于在虚拟表格的单元格中所布局的控件实例大小不一,单元格也没有固定或均一的大小,因此其仅用于布局的定位。grid()和pack()方法不能混合使用。

方法grid()常用的布局参数如下:

column:控件实例的起始列,最左边为第0列。

columnspan:控件实例所跨越的列数,默认为1列。

ipadx,ipady:控件实例所呈现区域内部的像素数,用来设置控件实例的大小。

padx,pady:控件实例所占据空间的像素数,用来设置控件实例所在单元格的大小。

row:控件实例的起始行,最上面为第0行。

rowspan:控件实例所跨越的行数,默认为1行。

用grid()方法排列标签,设想有一个3x4的表格,起始行、列序号均为0。将标签label_red置于第2列第0行;将标签label_green置于第0列第1行;将标签label_blue置于第1列起跨2列第2行,占20像素宽。

from tkinter import *

window = Tk()
label_red = Label(window, text='Red', fg='red', relief=GROOVE)
label_red.grid(column=2, row=0)
label_green = Label(window, text='绿色', fg='green', relief=GROOVE)
label_green.grid(column=0, row=1)
label_blue = Label(window, text='蓝', fg='blue', relief=GROOVE)
label_blue.grid(column=1, columnspan=2, ipadx=20, row=2)

window.mainloop()

 2.1关于columnspan参数,是控件实例所跨越的列数,也可以理解为是控件在column方向的合并数量,先介绍建立一个含8个标签的应用。

from tkinter import *

window = Tk()
window.title("The First Window, Xiaogu")  # 窗口标题
lab1 = Label(window, text="标签1", relief="raised")
lab2 = Label(window, text="标签2", relief="raised")
lab3 = Label(window, text="标签3", relief="raised")
lab4 = Label(window, text="标签4", relief="raised")
lab5 = Label(window, text="标签5", relief="raised")
lab6 = Label(window, text="标签6", relief="raised")
lab7 = Label(window, text="标签7", relief="raised")
lab8 = Label(window, text="标签8", relief="raised")
lab1.grid(row=0, column=0)
lab2.grid(row=0, column=1)
lab3.grid(row=0, column=2)
lab4.grid(row=0, column=3)
lab5.grid(row=1, column=0)
lab6.grid(row=1, column=1)
lab7.grid(row=1, column=2)
lab8.grid(row=1, column=3)

如果希望将标签2和标签3合并,便可以使用columnspan参数。

lab2.grid(row=0, column=1, columnspan=2)

 2.2关于rowspan参数,是控件实例所跨越的行数,也可以理解为是控件在row方向的合并数量,如果希望合并标签2和标签6,可以使用rowspan参数。

lab2.grid(row=0, column=1, rowspan=2)

3. place()方法

place()方法根据控件实例在父容器中的绝对或相对位置参数进行布局。其常用布局参数如下:

x,y:控件实例在根窗体中水平和垂直方向上布局的起始位置(单位为像素)。根窗体左上角为0,0,水平向右、垂直向下为正方向。

relx,rely:控件实例在根窗体中水平和垂直方向上起始布局的相对位置。即相对于根窗体宽和高的比例位置,取值在0.0~1.0之间。

height,width:控件实例本身的高度和宽度(单位为像素)。

relheight,relwidth:控件实例相对于根窗体的高度和宽度比例,取值在0.0~1.0之间。

利用place()方法配合relx,rely和relheight,relwidth参数所得到的界面可自适应根窗体尺寸的大小。

方法place()与方法grid()可以混合使用。

使用place()方法直接设定标签的位置:

from tkinter import *

window = Tk()
window.title("The First Window, Xiaogu")  # 窗口标题
lab1 = Label(window, text="I like Python",
             bg="lightyellow",  # 标签背景是浅黄色
             width=15)  # 标签宽度是15
lab2 = Label(window, text="I like Vision",
             bg="lightgreen",  # 标签背景是浅绿色
             width=15)  # 标签宽度是15
lab3 = Label(window, text="I like Ros",
             bg="lightblue",  # 标签背景是浅蓝色
             width=15)  # 标签宽度是15
lab1.place(x=0, y=0)  # 直接定位
lab2.place(x=30, y=50)  # 直接定位
lab3.place(x=60, y=100)  # 直接定位

window.mainloop()

 用place()方法排列消息(多行标签):在320x240像素的根窗体上,水平起始位置为相对于根窗体的20%,垂直起始位置为绝对位置80像素,高度为根窗体高度的40%,宽度为200像素,创建并布局消息Message的实例,其用法与标签Label类似。

from tkinter import *

window = Tk()
window.title("The First Window, Xiaogu")
window.geometry('320x240')
msg1 = Message(window, text='''
此标签的水平起始位置相对窗体0.2,垂直起始位置为绝对位置80像素,高度是窗体高度的0.4,宽度是200像素
''', relief=GROOVE)
msg1.place(relx=0.2, y=80, relheight=0.4, width=200)
window.mainloop()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

笨小古

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

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

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

打赏作者

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

抵扣说明:

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

余额充值