前段时间看见有人问文本框的定位,翻看了之前的全部文章,发现关于控件的布局只用了最简单的pack(),当时只想越简单突显主题就好,没有详细讲解控件布局,现在补上。
通过前面的文档我们已经知道Tkinter控件的简单使用,想要拥有一个简洁、合理的界面,控件布局就显得尤为重要了,而Tkinter提供了三种布局方式给我们,下面一一讲解:
一、pack是一种相对布局方式,指定控件的相对位置,精确位置会由系统完成,如下:
from tkinter import *
window = Tk()
Label(window,text='first',bg='red').pack()
Label(window,text='second',bg='green').pack()
Label(window,text='third',bg='yellow').pack()
window.mainloop()
上面的pack布局没有任何属性参数,默认会自上而下垂直并且水平居中排列,我们通过背景色可以知道默认情况下,标签的宽度会随着文本长度的变化而变化,不同的背景色也方便观察下面的参数差异,接下来我们详细讲解一下pack的属性参数:
1、用side水平排列控件
from tkinter import *
window = Tk()
Label(window,text='first',bg='red').pack(side=LEFT)
Label(window,text='second',bg='green').pack(side=RIGHT)
Label(window,text='third',bg='yellow').pack(side=BOTTOM)
window.mainloop()
我们可以通过side=TOP/BOTTOM/LEFT/RIGHT,控制控件的相对位置(上下左右),注意这里的相对位置是以上一个控件的位置作为参照的,可以多用几个控件尝试一下就知道其中的奥妙了;
2、利用fill=x来是控件和窗体一样宽:
from tkinter import *
window = Tk()
Label(window,text='first',bg='red').pack(fill=X)
Label(window,text='second',bg='green').pack(fill=X)
Label(window,text='third',bg='yellow').pack(fill=X)
Button(window,text='fourth',bg='blue').pack(fill=X)
window.mainloop()
2、用padx、pady、ipadx、ipady控制控件的边距
from tkinter import *
window = Tk()
Label(window,text='first',bg='red').pack(fill=X,padx=10) #水平外边距
Label(window,text='second',bg='green').pack(fill=X,pady=10) #垂直外边距
Label(window,text='third',bg='yellow').pack(fill=X,ipadx=10) #水平内边距
Button(window,text='fourth',bg='blue').pack(fill=X,ipady=10) #垂直内边距
window.mainloop()
二、place与pack相反,是一种绝对位置布局方式,说的简单点就是坐标定位方式,窗体最左上角的位置就是原点(x=0,y=0)
from tkinter import *
window = Tk()
Label(window,text='first',bg='red').place(x=10,y=10)
Label(window,text='second',bg='green').place(x=10,y=40)
Label(window,text='third',bg='yellow').place(x=10,y=70)
Button(window,text='fourth',bg='blue').place(x=10,y=100)
window.mainloop()
三、grid布局我们可以理解成单元格布局方式,窗体就像是一个表格,横向、纵向划分了若干格子,我们将控件依次放入格子中进行定位,这是相对pack和place折中的方法:
from tkinter import *
window = Tk()
Label(window,text='first',bg='red').grid(row=1,column=1)
Label(window,text='second',bg='green').grid(row=1,column=3)
Label(window,text='third',bg='yellow').grid(row=2,column=2)
Button(window,text='fourth',bg='blue').grid(row=3,column=1)
window.mainloop()
三种控件布局方式各有千秋,我比较习惯使用place进行布局,这个还是看习惯和需求,大家有什么好的技巧也可以在下面留言,一起交流学习进步哈!