文章目录
- Frame和LabelFrame控件
- Frame参数
- LabelFrame参数
tkinter系列:
- GUI初步💎布局💎绑定变量💎绑定事件💎消息框💎文件对话框
- Frame控件💎PanedWindow和notebook控件
- 扫雷小游戏💎强行表白神器
Frame和LabelFrame控件
对于一个稍微复杂的软件,界面上肯定会划分多个功能区,每个功能区内部又有一些子功能区,如果直接用按钮在窗口中乱排,那么软件的设计逻辑就比较脑残。而为了实现这种套娃模式,tkinter提供了Frame控件,简单地说,Frame就是一个可以容纳控件的容器,有了这个,就可以窗口中套着大Frame,大Frame套小Frame这样套下去。
import tkinter as tk
win = tk.Tk()
for i in range(3):
frm = tk.Frame(win)
frm.pack(side=tk.LEFT, expand=tk.YES, fill=tk.Y)
for j in range(3):
btn = tk.Button(frm, text=f"{i,j}", width=10)
btn.pack(side=tk.TOP,expand=tk.YES,fill=tk.X)
win.mainloop()
效果如下
当然,从感官上来说,上面的这种布局结构其实看不太出来应用了Frame组件。相比之下,LabelFrame就稍有特点。将上述绘图代码中的tk.Frame(win)改为tk.LabelFrame(win, text=f"第{i}列"),就可以得到下图
Frame参数
由于LabelFrame比Frame多了个标题,所以比Frame更复杂,简单起见,先介绍Frame的参数。一般Frame支持的参数,LabelFrame都支持。
首先,height和width用来设置宽度和高度;padx和pady用于设置水平和垂直方向上的边距。下面的表中给出了一些有关Frame边框的配色设置
选项 | 含义 |
---|---|
background/bg | 设置背景颜色,默认值由系统指定 |
borderwidth/bd | 指定的边框宽度,默认2像素 |
takefocus | 设为True时,可接受输入焦点,默认False |
highlightbackground | 未获得焦点的时候高亮边框的颜色 |
highlightcolor | 获得焦点的时候高亮边框的颜色 |
highlightthickness | 指定高亮边框的宽度,默认1或2像素 |
下面设置一下背景色和边框
import tkinter as tk
def showFrames(frms):
for i, frm in enumerate(frms):
frm.pack(side=tk.LEFT, expand=tk.YES, fill=tk.Y)
for j in range(3):
btn = tk.Button(frm, text=f"{i,j}", width=10)
btn.pack(side=tk.TOP,expand=tk.YES,fill=tk.X)
win = tk.Tk()
frms = [tk.Frame(win, bg='LightPink', bd=bd, takefocus=True,
highlightbackground="gray",
highlightcolor="red",
highlightthickness=bd,
) for bd in (2, 5, 10)]
showFrames(frms)
win.mainloop()
效果如下,当按下tab键时,可以看到被选中的Frame边框变红
LabelFrame参数
LabelFrame比Frame多了标题,相应多出来的参数基本都是有关文字设置的。
选项 | 含义 |
---|---|
text | 指定本,可以包含换行符 |
font | 文本字体 |
foreground/fg | 文本颜色 |
labelanchor | 文本显示位置,默认"nw" |
labelwidget | 指定一个组件替代text |
其中,labelanchor可选位置有"n", “ne”, “e”, “se”, “s”, “sw”, “w”, “nw”, 或 “center”,其ewsn代表东西南北,上北下南左西右东。
下面设置一下
win = tk.Tk()
frms = [tk.LabelFrame(win, text=lc, labelanchor=lc, bd=5,
fg='green', takefocus=True, highlightbackground="gray",
highlightcolor="red") for lc in ("nw", "s", "ne")]
showFrames(frms)
win.mainloop()
效果如下