文章主要介绍Python-用户接口i编程中所涉及到的Frame组件容器的使用,通过实例展示具体用法,frame的作用在于窗口需要进行复杂的组件管理的时候用得上,如果某个面板真的很复杂,那么你可能就需要tkinter.Frame来帮助你管理组件了;Frame的好处在于你能模块化管理一个面板中的组件,组件包括很多,有输入框,按钮,多选框,标签,菜单等等
目录
环境声明:
- 操作系统:windows10
- Python版本:3.7.4
- 使用工具:pycharm-community-2019.2
写在前面:
像类似windows资源管理器的那种ui界面,咋们来分析分析,他会包括那些模块呢,我用一张图片来说明下吧

windows的这个资源管理面板,如果我们只用组件添加到窗体中,不用模块管理,那么可以预知一下,windows资源管理器的组件都是无序的状态,什么叫无序的状态?那比如果说,假如资源管理器中只有以上图片中的侧边栏和主要板块,主要板块还有文件夹板块(快捷文件夹)和分区板块(磁盘驱动管理板块),那么如果不适用模块化管理,我在将窗口最大化的时候可不可能会变成这样子:

这个时候明显发生了组件位置错乱的情况,这点可以说明的是,文件夹面板和设备驱动器如果不放在一个组件容器中,那么肯定会发生组件位置错位的情况
Python中的组件容器--tkinter.Frame()
这样在窗体应用中,关于组件容器的概念应该理解了其作用了吧,那么在Python中,组件位于tkinter模块中,名字就叫做Frame的类(也可以理解为html中的frame标签,有一样的意义),我们在使用它的时候,需要进行初始化操作,也就是java中的构造方法需要的参数,必须的一个参数是父窗体对象引用,第二个参数是个字典类型的参数,这个参数就是用于设置组件容器的属性的。
1.组件的初始化方法(同理于java构造器)源码:
def __init__(self, master=None, cnf={}, **kw):
"""Construct a frame widget with the parent MASTER.
Valid resource names: background, bd, bg, borderwidth, class,
colormap, container, cursor, height, highlightbackground,
highlightcolor, highlightthickness, relief, takefocus, visual, width."""
我们可以看到的是,有三个参数
2.初始化参数一---master:
其中有个叫master的就是我们父容器,也可以叫做父窗体,我们在穿件组件容器的时候就必须要传入父容器,不然这个组件容器应该绘制到哪里呢?你说是吧!
3.初始化参数二---- cnf 和 **kw
那么第二个或者第三个都是字典参数,其实呢作用都是一样的,都会被解析为组件的配置字典集,源码中说的得很清楚,也就是方法体内部的说明性注释,百度翻译的意思是:
使用父主控形状构造一个框架小部件。
有效的关键字名称:background, bd, bg, borderwidth, class,colormap, container, cursor, height,highlightbackground,highlightcolor, highlightthickness, relief, takefocus, visual, width
这里的关键字名称就是设置项,见名知意的设置项就有背景(background,bg),边框线宽度(db、borderwidth),组件外部宽度(width),组件外部高度(height)等等
选项 | 含义 |
---|---|
background,bg | 组件的背景颜色,默认系统指定。之所以用两个参数来表示,bg是为了方便,background是为了见名知意,设置样式就有了灵活性 |
bodorwidth,db | 组件边框线宽度,默认为0 |
height | 整个组件的高度,默认为0 |
cursor | 指定当鼠标在当前组件悬浮的时候的鼠标样式,默认由系统指定的 |
highlightbackground | 设置当 Frame 不是活动窗口的时候高亮边框的颜色 |
highlightcolor | 设置当 Frame 获得焦点的时候高亮边框的颜色 |
highlightthickness | 设置高亮边框的宽度 |
padx | 左右的内边距 |
pady | 上下的内边距 |
relief | 这是边框线的样式,当然你的边框属性(db,bodorwidth)为0的话,那等于看不见哈.默认值为‘flat’,其他可选值有‘sunken’、‘raised’、‘groove’、‘ridge’,这些属性名字可以见名知意哦 |
takefocus | 1. 指定该组件是否接受输入焦点(用户可以通过 tab 键将焦点转移上来) 2. 默认值是 False |
colormap | 1. 有些显示器只支持 256 色(有些可能更少),这种显示器通常提供一个颜色映射来指定要使用要使用的 256 种颜色 2. 该选项允许你指定用于该组件以及其子组件的颜色映射 3. 默认情况下,Frame 使用与其父组件相同的颜色映射 4. 使用此选项,你可以使用其他窗口的颜色映射代替(两窗口必须位于同个屏幕并且具有相同的视觉特性) 5. 你也可以直接使用 "new" 为 Frame 组件分配一个新的颜色映射 6. 一旦创建 Frame 组件实例,你就无法修改这个选项的值 |
实际操作
from tkinter import *
# 创建顶级窗体,并且窗体标签栏显示topFrame
topFrame = Tk(className="topFrame")
# 设置组件容器属性字典集
sonFrameSetting = {
# 设置边框线的宽度
'bd': 3,
# 设置容器组件的高度
'height': 100,
# 设置组件容器的宽度
'width': 300,
# 设置组件容器的背景颜色
'background': 'blue',
# 设置边框线样式
'relief': 'ridge'
}
# 创建顶级窗口的组件容器,并传入组件属性
sonFrame = Frame(topFrame, sonFrameSetting);
# 绘制顶级窗体的组件容器
sonFrame.pack()
# 进入消息循环
topFrame.mainloop()
以上代码的绘制结果大概就是酱紫的啦

你看到的全都是蓝色,是因为你的窗体里面只有一个组件,如果我们在窗体里面而不是组件容器里面放一个按钮组件就知道啦,现将代码改一改:
from tkinter import *
# 创建顶级窗体,并且窗体标签栏显示topFrame
topFrame = Tk(className="topFrame")
# 设置组件容器属性字典集
sonFrameSetting = {
# 设置边框线的宽度
'bd': 3,
# 设置容器组件的高度
'height': 100,
# 设置组件容器的宽度
'width': 300,
# 设置组件容器的背景颜色
'background': 'blue',
# 设置边框线样式
'relief': 'ridge'
}
# 创建顶级窗口的组件容器,并传入组件设置
sonFrame = Frame(topFrame, sonFrameSetting)
# 配置按钮属性
buttomSetting = {
'text': '按钮哦'
}
# 新创建一个组件,用于放入到组件容器中
buttom = Button(topFrame, bottomSetting)
# 绘制按钮样式
buttom.pack()
# 绘制顶级窗体的组件容器
sonFrame.pack()
# 进入消息循环
topFrame.mainloop()
改完了后,就是酱紫的啦:
值得一看的参考链接:
Python Tkinter GUI编程组件及用法 ----c语言中文网
Tkinter 组件详解(五):Frame ----csdn