欢迎光临
我们一起进阶

Python的GUI编程(十七)Pack、Place、Grid

扫码或搜索:沉默王二
发送 290992
即可立即永久解锁本站全部文章

简介:

本文讲述如何使用 tkinter 的布局管理 (被称作 layout managers 或 geometry managers). tkinter 有三种布局管理方式:

· pack
· grid
· place

注意这三种布局管理在同一个 master window 里一定不可以混用! 布局管理有以下功能:

· 将控件放置在屏幕上,包括控件的位置及控件的大小
· 将控件注册到本地窗口系统中
· 管理控件在屏幕上的显示

虽然控件自己也可以指定大小和对齐方式等信息, 但最终的控件大小及位置还是由布局管理决定的.

Pack 布局管理

pack 是三种布局管理中最常用的. 另外两种布局需要精确指定控件具体的显示位置, 而 pack 布局可以指定相对位置, 精确的位置会由 pack 系统自动完成. 这也使得 pack 布局没有另外两种布局方式灵活. 所以 pack 是简单应用的首选布局

fill 控件填充方式
from Tkinter import *
root=Tk()
root1=Tk()
root.geometry('200x200')
# printroot.pack_slaves()
Label(root,text='pack').pack()
#使用用默认的设置pack将向下添加组件,第一个在最上方,然后是依次向下排列。
# 这样的话最后一个已经显示出来的,这就是为什么称Pack为弹性的容器的原因了,
# 虽然有这个特性,但它并不是总是能够按照我们的意思进行布局,我们可以强制设置容器的大小,以覆盖Pack的默认设置。Pack的优先级低。
for i in range(5):
    Label(root,text='pack'+str(i)).pack()
# printroot.pack_slaves()
#第一个只保证在Y方向填充,第二个保证在XY两个方向上填充,第三个不使用填充属性,
# 注意Pack只会吝啬地给出可以容纳这三个组件的最小区域,它不允许使用剩余的空间了,故下方留有“空白”。
Label(root,text ='pack5',bg = 'red').pack(fill = Y)
Label(root,text ='pack6',bg = 'blue').pack(fill = BOTH)
Label(root,text ='pack7',bg = 'green').pack(fill = X)

Label(root).pack()

# 创建三个Label分别使用不同的fill属性
Label(root1,text ='pack11',bg = 'red').pack(fill = Y,expand = 1)
Label(root1,text ='pack12',bg = 'blue').pack(fill = BOTH,expand = 1)
Label(root1,text ='pack13',bg = 'green').pack(fill = X,expand = 0)

# 创建三个Label分别使用不同的fill属性,改为水平放置
# 将第一个Label居左放置
Label(root1,text ='pack21',bg = 'red').pack(fill = Y,expand = 1,side = LEFT)
# 将第二个Label居右放置
Label(root1,text ='pack22',bg = 'blue').pack(fill = BOTH,expand = 1,side = RIGHT)
# 将第三个Label居左放置,靠Label放置,注意它不会放到Label1的左边
Label(root1,text ='pack23',bg = 'green').pack(fill = X,expand = 0,side = LEFT)

root.mainloop()
root1.mainloop()
设置组件之间的间隙大小

ipadx,ipady设置内部间隙
padx,pady设置外部间隙
side 顺次放置控件

from Tkinter import *
root=Tk()

# L1 =LabelFrame(root,text = 'pack1',bg = 'red').pack(side = LEFT,ipadx = 20)
Lb1=Label(root,text='Label1',bg='green')
Lb1.pack(side=LEFT,ipadx=20,expand=1)

Lb2=Label(root,text='Label2',bg='blue')
Lb2.pack(side=LEFT,padx=20,expand=1,fill=BOTH)

Lb3=Label(root,text='Label3',bg='red')
Lb3.pack(side=LEFT,pady=20,expand=0,fill=X)

root.mainloop()
Place 布局管理

Place 布局管理可以显式的指定控件的绝对位置或相对于其他控件的位置. 要使用 Place 布局, 调用相应控件的 place() 方法就可以了. 所有 tkinter 的标准控件都可以调用 place()
方法.

下面是一个使用 Place 布局的例子: 为 Label 控件设置随机的背景色, 然后计算各个 Label 的背景色的亮度(灰度值), 如果其亮度小于 120, 则将其前景色(文字颜色, fg属性)设置为白色, 否则设为黑色.

这样做是为了避免使背景色和前景色过于接近而导致文字不易阅读.

from Tkinter import *
root=Tk()
root.geometry('200x200')
lb=Label(root,text='Label',fg='red')
# 使用绝对坐标将组件放到指定的位置
lb.place(x=10,y=10,anchor=NW)

lb1=Label(root,text='Label2',fg='blue')
# 使用相对坐标放置组件位置
# relx,rely指定组件放置的绝对位置,范围为(0-1.0)
lb1.place(relx=0.5,rely=0.5,anchor=CENTER)

# place同时指定多个组件
# v = IntVar()
for i in range(1,6):
    Radiobutton(
        root,
        text = 'Radio' + str(i),
        # variable = v,
        #value = i
        ).place(y = 30* i,anchor = NW)

# 同时使用相对和绝对坐标时,相对坐标优先操作,然后是在这个相对坐标的基础上进行偏移
lb2 = Label(root,text= ' Place2',fg = 'green')
lb3 = Label(root,text= 'Place',fg = 'red')
# 先设置相对坐标为(0.01,0.2)
lb2.place(relx =0.01,rely = 0.2,anchor = CENTER,x = 160,y = 0)
# 先设置相对坐标为(0.01,0.02)
lb3.place(relx =0.01,rely = 0.02,anchor = CENTER,x = 160,y = 160)

root.mainloop()

Grid 布局管理

Pack 作为首选的布局管理方式,其运作方式并不是特别易于理解. 已经由 Pack 布局完成的设计也很难做出改变. Grid 布局在1996年作为另一种可供选择的布局方式被引入. Grid 布局方式易学易用, 但似乎大家还是习惯用 Pack.

Grid 在很多场景下是最好用的布局方式.相比而言, Pack 布局在控制细节方面有些力不从心. Place 布局虽然可以完全控制控件位置, 但这也导致使用 Place 会比其他两种布局方式更加复杂.

Grid 把控件位置作为一个二维表结构来维护,即按照行列的方式排列控件: 控件位置由其所在的行号和列号决定. 行号相同而列号不同的几个控件会被彼此上下排列; 列号相同而行号不同的几个控件会被彼此左右排列.

使用 Grid 布局的过程就是为各个控件指定行号和列号的过程. 不需要为每个格子指定大小, Grid 布局会自动设置一个合适的大小.

from Tkinter import *

colours = ['red', 'green', 'orange', 'white', 'yellow', 'blue']

r = 0
for c in colours:
    Label(text=c, relief=RIDGE, width=15).grid(row=r, column=0)
    Entry(bg=c, relief=SUNKEN, width=10).grid(row=r, column=1)
    r = r + 1

mainloop()  
赞(1) 打赏
分享到: 更多 (0)

评论 1

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #1

    优秀

    ziyou3周前 (09-22)回复

小白学堂,学的不止是技术,更是前程

关于我们免责声明

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏