Tkinter控件有特定的几何状态管理方法,管理整个控件区域组织,以下是Tkinter公开的几何管理类:包、网格、位置。
几何方法 | 描述 |
---|---|
pack() | 包装 |
grid() | 网格 |
place() | 位置 |
一、pack 包装
(一)pack选项
pack方法会从上到下,从左到右的摆放控件。
1.side
side的作用是放置控件的位置。有四个位置:left,right,top,bottom。LEFT:由左往右排列,RIGHT:由右往左排列,TOP:默认值,由上往下排列,BOTTOM:由下往上排列。
import tkinter as tk
init_window = tk.Tk()
init_window.geometry('300x240')
b1 = tk.Label(init_window,text='left')
b1.pack(side = tk.LEFT)
b2 = tk.Label(init_window,text='right')
b2.pack(side = tk.RIGHT)
b3 = tk.Label(init_window,text='top')
b3.pack(side=tk.TOP)
b4 = tk.Label(init_window,text='bottom')
b4.pack(side=tk.BOTTOM)
init_window.mainloop()
2.expand
正常的情况使用pack,此标签就在窗口的顶部居中显示。当expand值为True时,side选项无效。控件显示在父控件中心位置。expand取值:“yes”,“no”,“y”,“n”,“True”,“False”(默认值为"no"或0)
##标签左右、垂直居中
import tkinter
from tkinter import *
init_window = Tk() ## 实例化出一个父窗口
init_window.geometry('300x240')
label = Label(init_window, text="图像在左",compound="left",bitmap="error")
label.config(font="Helvetic 20 overstrike",cursor="shuttle")
label.pack(expand='yes')
init_window.mainloop()
3.fill
fill 参数的主要功能是告诉 pack管理程序,设置控件填满所分配容器区间的方式
参数:
fill = X:表示控件可以填满所分配空间的X轴不留白
fill = Y:表示控件可以填满所分配空间的Y轴不留白
fill = BOTH:表示控件可以填满所分配空间的X轴和Y轴
fill默认值为NONE,表示保持原大小
import tkinter as tk
init_window = tk.Tk()
init_window.geometry('300x240')
l = tk.Label(init_window,text='这是一个标签',bg='pink')
l.pack(expand='true',fill='x')
init_window.mainloop()
4.padx、pady、ipadx、ipady
- padx:可以设置标签文字左右边界与标签区间的x轴间距。
- pady:可以设置标签文字上下边界与标签区间的y轴距离。
- ipadx:标签内部的文字与小框框的水平距离
- ipady:标签内部的文字与小框框的垂直距离
import tkinter as tk
init_window = tk.Tk()
init_window.geometry('300x240')
l1 = tk.Label(init_window,text='这是一个对照标签',bg='pink')
l1.pack(expand='true')
l2 = tk.Label(init_window,text='标签内部的文字与小框框的距离',bg='blue')
l2.pack(expand='true',ipadx=20,ipady=40)
init_window.mainloop()
import tkinter as tk
init_window = tk.Tk()
init_window.geometry('300x240')
b1 = tk.Label(init_window,text='文本1',bg='pink')
b1.pack()
b2 = tk.Label(init_window,text='文本2',bg='pink')
b2.pack(pady=10)
b3 = tk.Label(init_window,text='文本3',bg='pink')
b3.pack(pady=(10,30))
b4 = tk.Label(init_window,text='文本4',bg='pink')
b4.pack()
b5 = tk.Label(init_window,text='文本5',bg='pink')
b5.pack(side='left')
b6 = tk.Label(init_window,text='文本6',bg='pink')
b6.pack(side='left',padx=20)
init_window.mainloop()
5.before、after、in_
before 和after可以改变pack控件的次序。in_的作用是设置当前控件的父控件,可以替换掉在控件初始化时候的父控件。
import tkinter as tk
init_window = tk.Tk()
init_window.geometry('300x240')
b1 = tk.Label(init_window,text='文本1')
b1.pack()
b2 = tk.Label(init_window,text='文本2')
b2.pack()
b3 = tk.Label(init_window,text='文本3被提前到文本2之前pack')
b3.pack(before=b2)
init_window.mainloop()
import tkinter as tk
init_window = tk.Tk()
init_window.geometry('300x240')
b1 = tk.Label(init_window,text='文本1')
b1.pack()
b2 = tk.Label(init_window,text='文本2',bg='blue')
b2.pack()
b3 = tk.Label(init_window,text='文本3被放在文本2中')
b3.pack(in_=b2)
init_window.mainloop()
(二)pack函数
函数名 | 描述 |
---|---|
slaves() | 以列表方式返回本控件的所有子控件对象 |
propagate(flag) | 设置为True表示父控件的几何大小由子控件决定(默认值),反之则无关 |
info() | 返回pack提供的选项所对应的数值,返回值为字典类型 |
forget() | 将控件隐藏并且忽略原有设置,对象依旧存在 |
pack() | 显示控件 |
1.slaves ()函数
slaves()函数返回本控件的所有子控件对象。如果不使用pack(),就算已经实例化了子控件,slaves()也不会输出没有pack()的子控件。比如b4就不会输出。而b2和b3会被认为是b1的子控件。
import tkinter as tk
init_window = tk.Tk()
init_window.geometry('300x240')
b1 = tk.Label(init_window,text='文本1')
b1.pack()
b2 = tk.Label(b1,text='文本2')
b2.pack()
b3 = tk.Label(b1,text='文本3')
b3.pack()
b4 = tk.Label(b1,text='文本4')
print(b1.slaves())
init_window.mainloop()
2.propagate(flag)函数
该函数决定父控件的大小是否与子控件有关。如果flag是True则父控件的大小为包括子控件的大小。如果flag是False,则表示父控件的大小与子控件无关。不过geometry()会让propagate()失效,窗口的大小由geometry()决定。
import tkinter as tk
init_window = tk.Tk()
b1 = tk.Label(init_window,text='文本1')
b1.pack()
b2 = tk.Label(init_window,text='文本2')
b2.pack()
b3 = tk.Label(init_window,text='文本3')
b3.pack()
init_window.propagate(False)
init_window.mainloop()
import tkinter as tk
init_window = tk.Tk()
b1 = tk.Label(init_window,text='文本1')
b1.pack()
b2 = tk.Label(init_window,text='文本2')
b2.pack()
b3 = tk.Label(init_window,text='文本3')
b3.pack()
init_window.propagate(True)
init_window.mainloop()
3.info() 函数
info()返回控件的信息。这些信息以字典的形式返回。
import tkinter as tk
init_window = tk.Tk()
b1 = tk.Label(init_window,text='文本1')
b1.pack()
print(b1.info())
init_window.mainloop()
4.forget() 函数
forget()函数是隐藏控件的。调用之后,该控件从父控件中消失。但是该控件的实例还是存在的。可以用pack()直接恢复显示这个控件。pack()是按照次序来的。以pack()的次序为准,而不是以实例化的次序。
import tkinter as tk
init_window = tk.Tk()
init_window.geometry('300x240')
b1 = tk.Label(init_window,text='文本1')
b1.pack()
b2 = tk.Label(init_window,text='文本2')
b2.pack()
b3 = tk.Label(init_window,text='文本3')
b3.pack()
def b3_forget():
b3.forget()
def b3_pack():
b3.pack()
b4 = tk.Button(init_window,text='隐藏文本3',command=b3_forget)
b4.pack()
b5 = tk.Button(init_window,text='显示文本3',command=b3_pack)
b5.pack()
init_window.mainloop()
#点击’隐藏文本3’按钮后,’文本3’的标签消失。
#再点击’显示文本3’按钮,则显示’文本3’
运行代码
点击隐藏文本
点击显示文本
二、grid网格
(一)grid选项
grid布局管理采用类似表格的结构来管理控件的,把窗口用单元格的形式来定位,可以像编辑表格一样放置控件。grid采用行列确定位置,行列交汇处为一个单元格。每一列中,列宽由这一列中最宽的单元格确定。每一行中,行高由这一行中最高的单元格决定。
名称 | 描述 |
---|---|
column | 控制所置单元格的列号 |
columnspan | 从控件所置单元格算起在列方向上的跨度 |
row | 控制所置单元格的行号 |
rowspan | 从控件所置单元格算起在行方向上的跨度 |
ipadx、ipady | 标签内部的文字与小框框的距离 |
padx、pady | 设置标签文字边界与标签区间的间距 |
in_ | 将本控件作为所选组建对象的子控件 |
sticky | 功能类似anchor,但是只可以设定N/S/W/E,即上/下/左/右对齐 |
注:相同column的Widget 控件,如果宽度不同的话,grid方法会保留最宽的控件当做基准,这时比较短的件会居中对齐。
1.row、column、rowspan、columnspan
import tkinter as tk
init_window = tk.Tk()
init_window.geometry('300x240')
b1 = tk.Label(init_window,text='跨\n两\n行',bg='pink')
b1.grid(row=0,column=0,rowspan=2)
b2 = tk.Label(init_window,text='跨两列',bg='yellow')
b2.grid(row=0 ,column=1,columnspan=2)
b3 = tk.Label(init_window,text='文本3',bg='cyan')
b3.grid(row=1,column=1)
b4 = tk.Label(init_window,text='文本4',bg='cyan')
b4.grid(row=1,column=2)
init_window.mainloop()
2.sticky
sticky的参数可以组合使用
参数 | 含义 |
---|---|
sticky=N+S | 可以拉长高度,让控件在顶端和底端对齐 |
sticky=W+E | 可以拉长宽度,让控件在左边和右边对齐 |
sticky=N+S+E | 可以拉长高度,让控件在顶端和底端对齐,同时切齐右边 |
sticky=N+S+W | 可以拉长高度,让控件在顶端和底端对齐,同时切齐左边 |
sticky=N+S+W+S | 可以拉长高度,让控件在顶端和底端对齐,同时切齐左右边 |
import tkinter as tk
init_window = tk.Tk()
label1 = tk.Label(init_window, text="One", relief="raised")
label2 = tk.Label(init_window, text="TwoTwoTwo", relief="raised")
label1.grid(row=0, column=0, sticky=tkinter.W + tkinter.E)
label2.grid(row=1, column=0)
init_window.mainloop()
(二)grid函数
1.forget、remove
forget控件后,不会记住当前位置,重新显示时,会按提交顺序显示。remove控件后,会记住当前位置,重新显示时,还在控件原位置。
import tkinter as tk
init_window = tk.Tk()
init_window.geometry('300x240')
b1 = tk.Label(init_window,text='文本1')
b1.grid(row=0, column=0)
def b1_forget():
b1.grid_forget()
def b1_grid():
b1.grid()
def b1_remove():
b1.grid_remove()
b2 = tk.Button(init_window,text='foget文本',command=b1_forget)
b2.grid(row=1, column=0)
b3 = tk.Button(init_window,text='remove文本',command=b1_remove)
b3.grid(row=2, column=0)
b4 = tk.Button(init_window,text='显示文本1',command=b1_grid)
b4.grid(row=3, column=0)
init_window.mainloop()
代码运行
forget
remove
2.grid_location(x,y)
返回坐标位置所在的单元格的行列坐标。
import tkinter as tk
init_window = tk.Tk()
init_window.geometry('300x240')
b1 = tk.Canvas(init_window,bg='blue',width=40,height=80)
b1.grid(row=0,column=0,rowspan=2)
b2 = tk.Canvas(init_window,bg='yellow',width=80,height=40)
b2.grid(row=0 ,column=1,columnspan=2)
b3 = tk.Canvas(init_window,bg='cyan',width=40,height=40)
b3.grid(row=1,column=1)
b4 = tk.Canvas(init_window,bg='gray',width=40,height=40)
b4.grid(row=1,column=2)
i=30
j=120
m = init_window.grid_location(i,j)
print("i=",i,"j=",j,m)
init_window.mainloop()
坐标位置在(30,120)的单元格在第1行,第3列的位置。
3.grid_rowconfigure()、grid_columnconfigure()
在设计控件的布局时,有时候会碰上窗口缩放大小,此时可以使用这两个方法设定第几行row或者是column的缩放比例。
import tkinter as tk
init_window = tk.Tk()
init_window.rowconfigure(1, weight=1) ## 第二行按比例1缩放
init_window.columnconfigure(0, weight=1) ## 第一列按比例1缩放
label1 = tk.Label(init_window, text="Label 1", bg="red")
label1.grid(row=0, column=0, padx=5, pady=5, sticky=tkinter.W)
label2 = tk.Label(init_window, text="Label 2", bg="blue")
label2.grid(row=0, column=1, padx=5, pady=5)
label3 = tk.Label(init_window, text="Label 3", bg="green")
label3.grid(row=1, column=0, columnspan=2, padx=5, pady=5, sticky=tkinter.N+tkinter.S+tkinter.W+tkinter.E)
init_window.mainloop()
三、place位置
place方法是最简单的一种布局方法,只需指定控件的显示位置即可。
(一)place选项
1.x、y、relx、rely
x、y指定在何处显示控件。relx和rely也是设定子控件的位置的。不过是相对的位置。取值范围是0~1。如果同时设定了x和y,那么就是把计算出来的相对位置与x,y分别相加,得出来的就是该控件的位置。
比如x=50,y=50,relx=0.5,rely=0.5,而父控件的大小是280和230(必须设定父控件的大小。否则,不会显示子控件),那么该控件的位置就是:
x = 50 + 2800.5 = 50+140 = 190
y = 50 + 2300.5 = 50+115 = 165