小白学tkinter(pack()包管理器grid()网格管理器place()位置管理器)

来源:互联网 发布:吉林十一选五遗漏数据 编辑:程序博客网 时间:2024/06/02 03:06

pack 是三种布局管理中最常用的. 另外两种布局需要精确指定控件具体的显示位置, 而 pack 布局可以指定相对位置, 精确的位置会由 pack 系统自动完成. 这也使得 pack 布局没有另外两种布局方式灵活. 所以 pack 是简单应用的首选布局, 比如只是想要将控件水平或垂直的逐个放在一起:

from tkinter import *root = Tk()Label(root, text="Red Sun", bg="red", fg="white").pack()Label(root, text="Green Grass", bg="green", fg="black").pack()Label(root, text="Blue Sky", bg="blue", fg="white").pack()mainloop()

这里写图片描述
下面将逐一讲解 pack 布局的各个属性.

fill 控件填充方式

在上面那个例子里, 我们简单的将三个 Label 控件 pack 到其父窗口上, 没有使用任何属性. 于是 pack 使用了默认方式进行布局: 从上到下顺次排放, 并水平居中. 同时我们也发现, pack 默认会将 Label 控件的宽度设置为其中的文字的宽度. 如果我们想让它们和其父窗口一样宽, 可以使用 fill=X 属性:

from tkinter import *root = Tk()w = Label(root, text="Red Sun", bg="red", fg="white")w.pack(fill=X)w = Label(root, text="Green Grass", bg="green", fg="black")w.pack(fill=X)w = Label(root, text="Blue Sky", bg="blue", fg="white")w.pack(fill=X)mainloop()

这里写图片描述
padding 控件边距

Pack 可以在四个方面控制控件边距: 内边距, 外边距, 水平边距, 垂直边距:

padx - 设置水平方向的外边距

from tkinter import *root = Tk()w = Label(root, text="Red Sun", bg="red", fg="white")w.pack(fill=X,padx=10)w = Label(root, text="Green Grass", bg="green", fg="black")w.pack(fill=X,padx=10)w = Label(root, text="Blue Sky", bg="blue", fg="white")w.pack(fill=X,padx=10)mainloop()

这里写图片描述
pady - 设置竖直方向的外边距

from tkinter import *root = Tk()w = Label(root, text="Red Sun", bg="red", fg="white")w.pack(fill=X,pady=10)w = Label(root, text="Green Grass", bg="green", fg="black")w.pack(fill=X,pady=10)w = Label(root, text="Blue Sky", bg="blue", fg="white")w.pack(fill=X,pady=10)mainloop()

这里写图片描述
ipadx - 设置水平方向的内边距

from tkinter import *root = Tk()w = Label(root, text="Red Sun", bg="red", fg="white")w.pack()w = Label(root, text="Green Grass", bg="green", fg="black")w.pack(ipadx=10)w = Label(root, text="Blue Sky", bg="blue", fg="white")w.pack()mainloop()

这里写图片描述
ipady - 设置竖直方向的内边距

from Tkinter import *root = Tk()w = Label(root, text="Red Sun", bg="red", fg="white")w.pack()w = Label(root, text="Green Grass", bg="green", fg="black")w.pack(ipadx=10)w = Label(root, text="Blue Sky", bg="blue", fg="white")w.pack(ipady=10)mainloop()

这里写图片描述
上述四个属性的默认值都是 0.

side 顺次放置控件

我们把上面那几个 Label 从左到右放在一排:

from Tkinter import *root = Tk()w = Label(root, text="red", bg="red", fg="white")#这里主要是LEFT控制的,#pady这三个标签的数值不是关键w.pack(padx=5, pady=10, side=LEFT)w = Label(root, text="green", bg="green", fg="black")w.pack(padx=5, pady=20, side=LEFT)w = Label(root, text="blue", bg="blue", fg="white")w.pack(padx=5, pady=20, side=LEFT)mainloop()

这里写图片描述
如果把上述 side 属性的值都改为 RIGHT, 那么上面 Label 控件的排列顺序就反过来了:
这里写图片描述
Place 布局管理

Place 布局管理可以显式的指定控件的绝对位置或相对于其他控件的位置. 要使用 Place 布局, 调用相应控件的 place() 方法就可以了. 所有 tkinter 的标准控件都可以调用 place()
方法.
下面是一个使用 Place 布局的例子: 为 Label 控件设置随机的背景色, 然后计算各个 Label 的背景色的亮度(灰度值), 如果其亮度小于 120, 则将其前景色(文字颜色, fg属性)设置为白色, 否则设为黑色. 这样做是为了避免使背景色和前景色过于接近而导致文字不易阅读.

import tkinter as tkimport randomroot = tk.Tk()# width x height + x_offset + y_offset:root.geometry("170x200+30+30") languages = ['Python','Perl','C++','Java','Tcl/Tk']labels = range(5)for i in range(5):   ct = [random.randrange(256) for x in range(3)]   brightness = int(round(0.299*ct[0] + 0.587*ct[1] + 0.114*ct[2]))   ct_hex = "%02x%02x%02x" % tuple(ct)   bg_colour = '#' + "".join(ct_hex)   l = tk.Label(root,                 text=languages[i],                 fg='White' if brightness < 120 else 'Black',                 bg=bg_colour)   l.place(x = 20, y = 30 + i*30, width=120, height=25)root.mainloop()

这里写图片描述

grid布局
grid布局又被称作网格布局,是最被推荐使用的布局。程序大多数都是矩形的界面,我们可以很容易把它划分为一个几行几列的网格,然后根据行号和列号,将组件放置于网格之中。使用grid 布局时,需要在里面指定两个参数,分别用row 表示行,column 表示列。需要注意的是 row 和 column 的序号都从0 开始。
这里写图片描述
grid属性设置
这里写图片描述
grid相关函数
这里写图片描述

补充grid()

总结如下:

  sticky=N/S/E//W:顶端对齐/底端对齐/右对齐/左对齐

  sticky=N+S:拉伸高度,使其在水平方向上顶端和底端都对齐

  sticky=E+W,拉伸宽度,使其在垂直方向上左边界和右边界都对齐

  sticky=N+S+E:拉伸高度,使其在水平方向上对齐,并将控件放在右边(当两个控件放在同一行同一列时效果明显)