Skip to content

布局组件

Frame 组件

Frame(框架)组件是在屏幕上的一个矩形区域。Frame 主要是作为其他组件的框架基础,或为其他组件提供间距填充。

Frame 组件主要用于在复杂的布局中将其他组件分组,也用于填充间距和作为实现高级组件的基类。

选项含义
background1. 设置 Frame 组件的背景颜色
2. 默认值由系统指定
3. 为了防止更新,可以将颜色值设置为空字符串
bgbackground 一样
borderwidth1. 指定 Frame 的边框宽度
2. 默认值是 0
bdborderwidth 一样
class_默认值是 Frame
colormap1. 有些显示器只支持 256 色(有些可能更少),这种显示器通常提供一个颜色映射来指定要使用要使用的 256 种颜色
2. 该选项允许你指定用于该组件以及其子组件的颜色映射
3. 默认情况下,Frame 使用与其父组件相同的颜色映射
4. 使用此选项,你可以使用其他窗口的颜色映射代替(两窗口必须位于同个屏幕并且具有相同的视觉特性)
5. 你也可以直接使用 "new"Frame 组件分配一个新的颜色映射
6. 一旦创建 Frame 组件实例,你就无法修改这个选项的值
container1. 该选项如果为 True,意味着该窗口将被用作容器,一些其它应用程序将被嵌入
2. 默认值是 False
cursor1. 指定当鼠标在 Frame 上飘过的时候的鼠标样式
2. 默认值由系统指定
height1. 设置 Frame 的高度
2. 默认值是 0
highlightbackground1. 指定当 Frame 获得焦点的时候高亮边框的颜色
2. 默认值由系统指定
highlightthickness1. 指定高亮边框的宽度
2. 默认值是 0(不带高亮边框)
padx水平方向上的边距
pady垂直方向上的边距
relief1. 指定边框样式
2. 默认值是 "flat"
3. 另外你还可以设置 "sunken""raised""groove""ridge"
4. 注意,如果你要设置边框样式,记得设置 borderwidthbd 选项不为 0,才能看到边框
takefocus1. 指定该组件是否接受输入焦点(用户可以通过 tab 键将焦点转移上来)
2. 默认值是 False
visual1. 为新窗口指定视觉信息
2. 该选项没有默认值
width1. 设置 Frame 的宽度
2. 默认值是 0

案例

python
import tkinter as tk

root = tk.Tk()
root.geometry("500x300+100+100")

left_frame = tk.Frame(root, width=250)
left_frame.pack(side=tk.LEFT)

tk.Label(left_frame, bg='red', width=10, height=2).pack(fill=tk.X)
tk.Label(left_frame, bg='blue', width=10, height=2).pack(fill=tk.X)
tk.Label(left_frame, bg='yellow', width=10, height=2).pack(fill=tk.X)

right_frame = tk.Frame(root)
right_frame.pack(side=tk.RIGHT)
tk.Label(right_frame, bg='red', width=2, height=10).pack(side=tk.LEFT)
tk.Label(right_frame, bg='blue', width=2, height=10).pack(side=tk.LEFT)
tk.Label(right_frame, bg='yellow', width=2, height=10).pack(side=tk.LEFT)

root.mainloop()

image-20201201170212636

LabelFrame 组件

LabelFrame 组件是 Frame 框架的进化版,从形态上来说,也就是添加了 Label 的 Frame ,但有了它,Checkbutton 和 Radiobutton 的组件分组就变得简单了:

python
import tkinter as tk

root = tk.Tk()
root.geometry("500x300+100+100")
group = tk.LabelFrame(root, text='最好的脚本语言是?', padx=5, pady=5)
group.pack(side=tk.LEFT, padx=10, pady=10)

langs = [
    ('python', 1),
    ('perl', 2),
    ('ruby', 3),
    ('lua', 4),
]

v = tk.IntVar()
v.set(1)

for lang, no in langs:
    b = tk.Radiobutton(group, text=lang, variable=v, value=no)
    b.pack(anchor=tk.W)

info_frame = tk.Frame(root)
info_frame.pack(side=tk.RIGHT)

tk.Label(info_frame, text="数据日志").pack()
text_area = tk.Text(info_frame, height=20, width=100)
text_area.pack(side=tk.LEFT)

root.mainloop()

image-20201201170159499