2tk布局管理pack(),grid(),place()方法

'''
***pack()方法中的参数:
    1.side              设置组件水平展示或者垂直展示
    2.padx              设置组件距离窗口的水平距离
    3.pady              设置组件距离窗口的垂直距离
    4.ipadx             设置组件内的文字距离组件边界的水平距离
    5.ipady             设置组件内的文字距离组件边界的垂直距离
    6.fill              设置组件填充所在的空白空间的方式
    7.expand            设置组件是否完全填充其余空间
    8.anchor            设置组件在窗口中的位置
    9.before            设置该组件应该位于指定组件的前面
    10.after            设置该组件应该位于指定组件的后面

1.side在水平、垂直主要有4个属性:
    1.top               指组件从上到下依次排列,这是side参数的默认值。
    2.bottom            指组件从下到上依次排列。
    3.left              指组件从左到右依次排列。
    4.right             指组件从右向左依次排列。
实例1:左到右
from tkinter import *
win = Tk()
v1 = '门前一颗树'
v2 = '左边一口井'
v3 = '右边一辆车'
Label(win,text=v1,bg='green').pack(side='left')
Label(win,text=v2,bg='pink').pack(side='left')
Label(win,text=v3,bg='yellow').pack(side='left')
win.mainloop()

实例2:下到上
from tkinter import *
win = Tk()
v1 = '门前一颗树'
v2 = '左边一口井'
v3 = '右边一辆车'
Label(win,text=v1,bg='green').pack(side='bottom')
Label(win,text=v2,bg='pink').pack(side='bottom')
Label(win,text=v3,bg='yellow').pack(side='bottom')
win.mainloop()

2、3、padx和pady,设置组件距离窗口的距离,单位px分辨率
from tkinter import *
win = Tk()
v1 = '门前一颗树'
v2 = '左边一口井'
v3 = '右边一辆车'
Label(win,text=v1,bg='green').pack(side='bottom',padx=50,pady=30)
Label(win,text=v2,bg='pink').pack(side='bottom',padx=50,pady=30)
Label(win,text=v3,bg='yellow').pack(side='bottom',padx=50,pady=30)
win.mainloop()

4、5、ipadx和ipady,设置组件内的文字距离组件边界的距离,单位px分辨率
from tkinter import *
win = Tk()
v1 = '门前一颗树'
v2 = '左边一口井'
v3 = '右边一辆车'
Label(win,text=v1,bg='green').pack(side='bottom',padx=50,pady=30,ipadx=50,ipady=30)
Label(win,text=v2,bg='pink').pack(side='bottom',padx=50,pady=30,ipadx=50,ipady=30)
Label(win,text=v3,bg='yellow').pack(side='bottom',padx=50,pady=30,ipadx=50,ipady=30)
win.mainloop()

实例斗兽棋的规则
from tkinter import *
win = Tk()
win.title('斗兽棋规则')

l1 = Label(win,text='象吃狮',bg='red',font=14)
l2 = Label(win,text='狮吃虎',bg='red',font=14)
l3 = Label(win,text='虎吃豹',bg='red',font=14)
l4 = Label(win,text='豹吃狼',bg='red',font=14)
l5 = Label(win,text='狼吃狗',bg='red',font=14)
l6 = Label(win,text='狗吃猫',bg='red',font=14)
l7 = Label(win,text='猫吃鼠',bg='red',font=14)
l8 = Label(win,text='鼠吃象',bg='red',font=14)

l1.pack(side='left',padx=10,pady=5,ipadx=6,ipady=4)
l2.pack(side='left',padx=10,pady=5,ipadx=6,ipady=4)
l3.pack(side='left',padx=10,pady=5,ipadx=6,ipady=4)
l4.pack(side='left',padx=10,pady=5,ipadx=6,ipady=4)
l5.pack(side='left',padx=10,pady=5,ipadx=6,ipady=4)
l6.pack(side='left',padx=10,pady=5,ipadx=6,ipady=4)
l7.pack(side='left',padx=10,pady=5,ipadx=6,ipady=4)
l8.pack(side='left',padx=10,pady=5,ipadx=6,ipady=4)
win.mainloop()

6、fill,设置组件填充所在的空白空间的方式,它有4个属性:
    x:表示完全填充水平方向的空白空间。
    y:表示完全填充垂直方向的空白空间。
    both:表示完全填充水平和垂直方向的空白空间。
    none:表示不填充空白空间(默认值)。

实例:运行后,你不管怎么拉窗口的大小,y方向上都是填充满的,但x就会有空白
from tkinter import *
win = Tk()
v = '天若有情天亦老,人间正道是沧桑'
l1 = Label(win,text=v,bg='#ba55d3',font='14',fg='red').pack(side='left',fill='y')
win.mainloop()

实例斗兽棋的规则 纵向填充

l1.pack(side='left',padx=10,pady=5,ipadx=6,fill='y')
l2.pack(side='left',padx=10,pady=5,ipadx=6,fill='y')
l3.pack(side='left',padx=10,pady=5,ipadx=6,fill='y')
l4.pack(side='left',padx=10,pady=5,ipadx=6,fill='y')
l5.pack(side='left',padx=10,pady=5,ipadx=6,fill='y')
l6.pack(side='left',padx=10,pady=5,ipadx=6,fill='y')
l7.pack(side='left',padx=10,pady=5,ipadx=6,fill='y')
l8.pack(side='left',padx=10,pady=5,ipadx=6,fill='y')
win.mainloop()

7、expand:设置组件是否填满父容器的额外空间,其属性值有两个,分别是True(或者1)和False(或者0)。
    1True/1         表示组件填满父容器的整个空间。
    2False/0        表示组件不填满父容器的整个空间。

实例:当上下水平拉伸时可以看到效果
l1.pack(side='left',padx=10,pady=5,ipadx=6,fill='y',expand=1)
l2.pack(side='left',padx=10,pady=5,ipadx=6,fill='y',expand=1)
l3.pack(side='left',padx=10,pady=5,ipadx=6,fill='y',expand=1)
l4.pack(side='left',padx=10,pady=5,ipadx=6,fill='y',expand=1)
l5.pack(side='left',padx=10,pady=5,ipadx=6,fill='y',expand=1)
l6.pack(side='left',padx=10,pady=5,ipadx=6,fill='y',expand=1)
l7.pack(side='left',padx=10,pady=5,ipadx=6,fill='y',expand=1)
l8.pack(side='left',padx=10,pady=5,ipadx=6,fill='y',expand=1)
win.mainloop()

8、anchor            设置组件在父窗口中的位置,默认为center(上下左右居中),另可选:八方(e,s,w,n,nw,ne,sw,se)
from tkinter import *
win = Tk()
l1 = Button(win,text='下一步',bg='gray',font=14)
l1.pack(anchor='s',side='right',padx=10,pady=10)
win.mainloop()

实例:模拟确认退出本窗口的对话框
from tkinter import *
win=Tk()
win.geometry('350x150')
win.title('tkinter的初使用')
b1 = Label(win,text='确定退出本窗口吗?')
b2 = Button(win,text='确定退出',bg='red')
b3 = Button(win,text='我再想想',bg='green')
b1.pack(fill='x',pady=20)
b2.pack(side='right',padx='10',ipadx='6',pady='20',anchor='se')
b3.pack(side='right',padx='10',ipadx='6',pady='20',anchor='se')
win.mainloop()

9、10、before、after            设置该组件应该位于指定组件的前后顺序
from tkinter import *
win = Tk()
win.title('tkinter使用')

#打乱顺序
l4 = Label(win,text='豹吃狼',bg='red',font=14)
l2 = Label(win,text='狮吃虎',bg='red',font=14)
l3 = Label(win,text='虎吃豹',bg='red',font=14)
l5 = Label(win,text='狼吃狗',bg='red',font=14)
l7 = Label(win,text='猫吃鼠',bg='red',font=14)
l6 = Label(win,text='狗吃猫',bg='red',font=14)
l8 = Label(win,text='鼠吃象',bg='red',font=14)
l1 = Label(win,text='象吃狮',bg='red',font=14)

l1.pack(side='left',padx=10,pady=5,ipadx=6,fill='y',expand=1)
l2.pack(side='left',padx=10,pady=5,ipadx=6,fill='y',expand=1,before=l1)
l3.pack(side='left',padx=10,pady=5,ipadx=6,fill='y',expand=1,before=l2)
l4.pack(side='left',padx=10,pady=5,ipadx=6,fill='y',expand=1,before=l3)
l5.pack(side='left',padx=10,pady=5,ipadx=6,fill='y',expand=1,before=l4)
l6.pack(side='left',padx=10,pady=5,ipadx=6,fill='y',expand=1,before=l5)
l7.pack(side='left',padx=10,pady=5,ipadx=6,fill='y',expand=1,before=l6)
l8.pack(side='left',padx=10,pady=5,ipadx=6,fill='y',expand=1,before=l7)
win.mainloop()

说明:anchor,fill,side等参数的作用效果是相互影响的,大家要灵活使用。
'''

'''
***grid()方法中的参数:
    1.row               组件所在的行
    2.column            组件所在的列
    3.rowspan           组件横向合并的行数
    4.columnspan        组件纵向合并的列数
    5.sticky            组件填充所分配空间空白区域的方式
    6.padx,pady         组件距离窗口边界的水平和垂直方向的距离

1、2、row,column          定义组件的行和列,默认值为row=0,column=0,而单元格的大小取决于最大的组件的宽度。
实例:九九乘法口决表
from tkinter import *
win = Tk()
win.title('乘法口决表')
for i in range(1,10):
    for j in range(i,10):
        Button(win,text='%s * %s = %s'%(i,j,i*j),bg='pink').grid(row=j,column=i,padx=10)
win.mainloop()

3、4、rowspan,columnspan  组件横向合并列数和纵向合并的行数
from tkinter import *
win = Tk()
win.title('乘法口决表')
l = ['red','yellow','pink','gray','purple','white','brown','green','aqua','aquamarine']
for i in range(1,10):
    for j in range(i,10):
        Button(win,text='%s * %s = %s'%(i,j,i*j),bg=l[i],width=9).grid(row=j,column=i,padx=40,pady=20,rowspan=2,columnspan=2)
win.mainloop()
注:合并行和列只会增加占用的空间(行数和列数),而不会增大组件本身的大小如:width=9

5、sticky:组件填充所分配空间空白区域的方式,其功能与anchor类似,不过它只有4个可选参数,即N(上对齐)、S(下对齐)、W(左对齐)、E(右对齐)。
实例:
from tkinter import *
win = Tk()
Label(win,text='春花秋月何时了',bg='pink',relief='groove').grid(row=0,column=0)
Label(win,text='行事知多少',bg='pink',relief='groove').grid(row=1,column=0,sticky=W)
win.mainloop()
sticky:支持组合使用:sticky=N+S,sticky=N+S+W,sticky=N+S+W+E
实例:
from tkinter import *
win = Tk()
Label(win,text='春花秋月何时了',bg='pink',relief='groove').grid(row=0,column=0)
Label(win,text='行事知多少',bg='pink',relief='groove').grid(row=1,column=0,sticky=W+E)
win.mainloop()

6、padx和pady,设置组件距离窗口的距离,单位px分辨率

rowconfigure()方法和columnconfigure()方法设置组件的缩放比例:
    tkinter窗口默认情况下是可以通过鼠标拖动来改变窗口的大小的,而当窗口大小被改变时,
    可以通过rowconfigure()方法和columnconfigure()方法设置组件行和列的缩放比例。

实例:
from tkinter import *
win = Tk()
win.rowconfigure(0,weight=1)
win.columnconfigure(1,weight=1)
Label(win,width=15,height=2,bg='pink',relief='groove').grid(row=0,column=0,sticky=W+N)
Label(win,width=15,height=2,bg='pink',relief='groove').grid(row=0,column=1,sticky=E+N)
Label(win,width=15,height=2,bg='pink',relief='groove').grid(row=1,column=0,sticky=S+W)
Label(win,width=15,height=2,bg='pink',relief='groove').grid(row=1,column=1,sticky=S+E)
win.mainloop()
注:rowconfigure()和columnconfigure()方法是设置在父容器上而并非设置在组件上,这一点要尤为注意
from tkinter import *
win = Tk()
win.rowconfigure(0,weight=1)                #设置和不设置的区别
win.columnconfigure(1,weight=1)             #设置和不设置的区别
Label(win,width=15,height=2,bg='pink',relief='groove').grid(row=0,column=0,sticky=W+N)
Label(win,width=15,height=2,bg='pink',relief='groove').grid(row=0,column=1,sticky=E+N)
Label(win,width=15,height=2,bg='pink',relief='groove').grid(row=1,column=0,sticky=S+W)
Label(win,width=15,height=2,bg='pink',relief='groove').grid(row=1,column=1,sticky=S+E)
win.mainloop()
'''

'''
***place()方法中的参数:
    1,x,y                       设置组件水平和重直距离
    2,width,height              设置组件宽度和高度
    3,relx,rely                 设置组件距离容器左侧和距离顶部的相对距离。数值范围(0~1)
    4,relwidth,relheight        组件相对父容器的宽度和高度。数值范围(0~1)

实例:华容道用x,y,width,height布局华容道
from tkinter import *
win = Tk()
win.title('华容道')
win.geometry('240x300')
l1 = Label(win,text='赵云',bg='pink',relief='groove',font=14)
l2 = Label(win,text='曹操',bg='pink',relief='groove',font=14)
l3 = Label(win,text='黄忠',bg='pink',relief='groove',font=14)
l4 = Label(win,text='张飞',bg='pink',relief='groove',font=14)
l5 = Label(win,text='关羽',bg='pink',relief='groove',font=14)
l6 = Label(win,text='马超',bg='pink',relief='groove',font=14)
l7 = Label(win,text='卒',bg='pink',relief='groove',font=14)
l8 = Label(win,text='卒',bg='pink',relief='groove',font=14)
l9 = Label(win,text='卒',bg='pink',relief='groove',font=14)
l0 = Label(win,text='卒',bg='pink',relief='groove',font=14)

l1.place(width=60,height=120,x=0,y=0)
l2.place(width=120,height=120,x=60,y=0)
l3.place(width=60,height=120,x=180,y=0)
l4.place(width=60,height=120,x=0,y=120)
l5.place(width=120,height=60,x=60,y=120)
l6.place(width=60,height=120,x=180,y=120)
l7.place(width=60,height=60,x=60,y=180)
l8.place(width=60,height=60,x=120,y=180)
l9.place(width=60,height=60,x=0,y=240)
l0.place(width=60,height=60,x=180,y=240)

win.mainloop()

实例::华容道用relx,rely,relwidth,relheight布局华容道
from tkinter import *
win = Tk()
win.title('华容道')
win.geometry('240x300')
l1 = Label(win,text='赵云',bg='pink',relief='groove',font=14)
l2 = Label(win,text='曹操',bg='pink',relief='groove',font=14)
l3 = Label(win,text='黄忠',bg='pink',relief='groove',font=14)
l4 = Label(win,text='张飞',bg='pink',relief='groove',font=14)
l5 = Label(win,text='关羽',bg='pink',relief='groove',font=14)
l6 = Label(win,text='马超',bg='pink',relief='groove',font=14)
l7 = Label(win,text='卒',bg='pink',relief='groove',font=14)
l8 = Label(win,text='卒',bg='pink',relief='groove',font=14)
l9 = Label(win,text='卒',bg='pink',relief='groove',font=14)
l0 = Label(win,text='卒',bg='pink',relief='groove',font=14)

l1.place(relwidth=0.25,relheight=0.4,relx=0,rely=0)
l2.place(relwidth=0.5,relheight=0.4,relx=0.25,rely=0)
l3.place(relwidth=0.25,relheight=0.4,relx=0.75,rely=0)
l4.place(relwidth=0.25,relheight=0.4,relx=0,rely=0.4)
l5.place(relwidth=0.5,relheight=0.2,relx=0.25,rely=0.4)
l6.place(relwidth=0.25,relheight=0.4,relx=0.75,rely=0.4)
l7.place(relwidth=0.25,relheight=0.2,relx=0.25,rely=0.6)
l8.place(relwidth=0.25,relheight=0.2,relx=0.5,rely=0.6)
l9.place(relwidth=0.25,relheight=0.2,relx=0,rely=0.8)
l0.place(relwidth=0.25,relheight=0.2,relx=0.75,rely=0.8)

win.mainloop()
'''
from tkinter import *
win = Tk()
win.title('华容道')
win.geometry('240x300')
l1 = Label(win,text='赵云',bg='pink',relief='groove',font=14)
l2 = Label(win,text='曹操',bg='pink',relief='groove',font=14)
l3 = Label(win,text='黄忠',bg='pink',relief='groove',font=14)
l4 = Label(win,text='张飞',bg='pink',relief='groove',font=14)
l5 = Label(win,text='关羽',bg='pink',relief='groove',font=14)
l6 = Label(win,text='马超',bg='pink',relief='groove',font=14)
l7 = Label(win,text='卒',bg='pink',relief='groove',font=14)
l8 = Label(win,text='卒',bg='pink',relief='groove',font=14)
l9 = Label(win,text='卒',bg='pink',relief='groove',font=14)
l0 = Label(win,text='卒',bg='pink',relief='groove',font=14)

l1.place(relwidth=0.25,relheight=0.4,relx=0,rely=0)
l2.place(relwidth=0.5,relheight=0.4,relx=0.25,rely=0)
l3.place(relwidth=0.25,relheight=0.4,relx=0.75,rely=0)
l4.place(relwidth=0.25,relheight=0.4,relx=0,rely=0.4)
l5.place(relwidth=0.5,relheight=0.2,relx=0.25,rely=0.4)
l6.place(relwidth=0.25,relheight=0.4,relx=0.75,rely=0.4)
l7.place(relwidth=0.25,relheight=0.2,relx=0.25,rely=0.6)
l8.place(relwidth=0.25,relheight=0.2,relx=0.5,rely=0.6)
l9.place(relwidth=0.25,relheight=0.2,relx=0,rely=0.8)
l0.place(relwidth=0.25,relheight=0.2,relx=0.75,rely=0.8)

win.mainloop()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值