这篇博客主要是总结一下Tkinter中的布局管理器的用法。
Tkinter中的布局管理器
1.pack:按照添加的顺序排列组件,默认将添加的组件依次纵向排列
2.grid:按照行/列形式排列组件
3.place:允许程序员指定组件的大小和位置
注意:不要在同一个父组件中混合使用pack和grid因为Tkinter会很认真地在那儿计算到底先使用哪个布局管理器,以至于你等了半个多小时,Tkinter还是在那儿纠结不出结果
1.pack布局管理器
from tkinter import *
root = Tk()
listbox = Listbox(root)
#fill选项告诉窗口管理器该组件将填充
#整个分配给他的空间,BOTH表示同时横向和
#纵向拓展,X表示横向,Y表示纵向
#expand选项是告诉窗管理器将父组件的额外
#空间也填满
listbox.pack(fill=BOTH,expand=True)
for i in range(10):
listbox.insert(END,i)
mainloop()
如果想要组件横向挨个儿排列,可以使用side选项
Label(root,text='red').pack(side=LEFT)
2.grid布局管理器
默认情况下组件会居中显示在对应的网格里,可以使用sticky选项来修改这一特性,该选项可以使用的值有E、W、S、N
from tkinter import *
root = Tk()
Label(root,text='用户名').grid(row=0,sticky=W)
Label(root,text='密码').grid(row=1,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()
photo = PhotoImage(file='photo.gif')
#这样便可以实现跨一二两行来放置label控件
Label(root,image=photo).grid(row=0,column=2,rowspan=2)
Label(root,text='用户名').grid(row=0,sticky=W)
Label(root,text='密码').grid(row=1,sticky=W)
Entry(root).grid(row=0,column=1)
Entry(root,show='*').grid(row=1,column=1)
mainloop()
使用跨行跨列功能前后对比:
3.place布局管理器
通常情况下不建议使用place布局管理器,因为对比起pack和grid,place要做更多的工作不过在一些特殊的情况下可以发挥妙用。
例如,我们可以使用place将子组件显示在父组件的正中央
from tkinter import *
root = Tk()
def callback():
print("正中靶心")
#其中relx表示子组件相对于父组件的位置,0表示最左边
#1表示最右边,0.5表示中间位置
#其中rely表示子组件相对于父组件的位置,0表示最上边
#1表示最下边,0.5表示中间位置
Button(root,text='点我',\
command=callback).place(relx=0.5,rely=0.5,anchor=CENTER)
mainloop()
关于Tkinter中的布局管理器就先介绍到这里,之后会继续补充