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