如何使用grid布局管理器在Tcl/Tk窗口中居中frame及内部控件?
Tcl/Tk grid布局居中实现方案
实现frame在顶层窗口永久居中
直接使用默认grid .frame配置时,网格单元默认不会随窗口拉伸扩展,frame自然会停在左上角,只需两步配置即可实现居中:
- 给顶层窗口(根窗口
.或自定义的toplevel窗口)放置frame的行列设置权重,让该网格单元能分配窗口拉伸产生的所有多余空间 - frame放置时不设置
-sticky参数,组件会保持自身原有尺寸,自动在所属网格单元内居中
对应配置代码:
# 主窗口第0列、第0行权重设为1,拉伸时所有多余空间优先分配给该单元格 grid columnconfigure . 0 -weight 1 grid rowconfigure . 0 -weight 1 # 放置frame到第0行0列,默认居中 grid .frame -row 0 -column 0
实现标签、按钮在frame内双向居中
逻辑和窗口层居中一致,需要给frame内部的网格配置权重,让组件所在区域始终处于frame的中心位置:
- 给frame内放置组件的列设置权重1,占走水平方向所有多余空间
- 在组件区域的上下各设置一个带权重的空行,占走垂直方向的多余空间,把组件挤到垂直中心位置
- 标签和按钮放置时同样不设置
-sticky参数,保持原尺寸在单元格内居中,可通过-pady调整两个组件的垂直间距
完整可运行代码:
frame .frame ttk::label .frame.title -text "Rocket 1" ttk::button .frame.button -text "Launch!" # 主窗口层配置:frame居中 grid columnconfigure . 0 -weight 1 grid rowconfigure . 0 -weight 1 grid .frame -row 0 -column 0 -padx 10 -pady 10 # frame内部配置:组件双向居中 grid columnconfigure .frame 0 -weight 1 # 上下空行权重设为1,分配所有垂直多余空间 grid rowconfigure .frame 0 -weight 1 grid rowconfigure .frame 3 -weight 1 # 放置组件,pady调整组件间距 grid .frame.title -row 1 -column 0 -pady 5 grid .frame.button -row 2 -column 0 -pady 5
实现效果参考:
说明:
-weight参数代表网格行/列分配多余空间的权重,默认值为0即不随拉伸扩展;-sticky参数控制组件在网格单元内的拉伸/对齐规则,不填时默认居中显示原尺寸组件,传入nsew则会让组件拉伸填满整个单元格。
内容的提问来源于stack exchange,提问作者Flux
相关产品推荐
相关产品推荐

