TCL用了有段时间,但是都是复制别人代码做的UI,每次要用的时候都是重新看,或者瞎改,实际上自己对几何管理器还是不懂。
今天看了一下,做下总结:
(1)grid不能控制组件尺寸一样,但pack可以(就目前所知):
labelframe .f -text "haha"
button .ok -text ok
button .cancel -text cancel
button .help -text help
#增加“-expand 1 -fill both ”,则随着窗口尺寸变大,.f从组件(按钮)尺寸变大
pack .ok .cancel .help -in .f -side top -padx 12m -pady 1m -expand 1 -fill both
grid .f -sticky news
grid rowconfigure . 0 -weight 1
grid columnconfigure . 0 -weight 1
代码说明:
只有pack有-expand和-fill,expand将当前要打包的组件块区填满当前剩余的空间,fill将组件窗口填满组件块区,一般两个选项一起使用; -side top表示从上往下排列组件;-padx为外部补白,如果设置-side left,则效果如下:
12m表示12毫米,如果没有m则表示像素;
grid .f -sticky news将.f交给几何管理器,如果没有这条语句则不会显示组框.f和里面的按钮,-sticky news指定了.f在它的单元格中全范围分布,因为总共只有1个单元格,所以.f就充满整个窗口了;
grid rowconfigure . 0 -weight 1将主窗体.的从组件(只有一个.f)设置为随窗体尺寸变化,当有多个从组件均设置了weight时,值越大尺寸占比例越大;这里如果不设置则手动改变窗体尺寸时,组框.f的大小不变。
(2)书本中<TCL/YK入门经典>的例子:
#.demo 按钮随着勾选nsew会变大变小,若勾选全部,则布满单元格
button .demo -textvariable stickyLabel -bd 2 -relief raised
checkbutton .n -text "n" -bd 2 -relief raised \
-variable stickyN -onvalue n -offvalue {} \
-command redo_sticky
checkbutton .s -text "s" -bd 2 -relief raised \
-variable stickyS -onvalue s -offvalue {} \
-command redo_sticky
checkbutton .e -text "e" -bd 2 -relief raised \
-variable stickyE -onvalue e -offvalue {} \
-command redo_sticky
checkbutton .w -text "w" -bd 2 -relief raised \
-variable stickyW -onvalue w -offvalue {} \
-command redo_sticky
grid .demo -row 1 -column 1
grid .n -row 0 -column 1 -sticky nsew
grid .s -row 2 -column 1 -sticky nsew
grid .e -row 1 -column 2 -sticky nsew
grid .w -row 1 -column 0 -sticky nsew
grid rowconfigure . 1 -weight 1
grid columnconfigure . 1 -weight 1
wm geometry . 180x100
proc redo_sticky {} {
global stickyN stickyS stickyE stickyW stickyLabel
append s2 $stickyN $stickyS $stickyE $stickyW
grid .demo -row 1 -column 1 -sticky $s2
set stickyLabel [list -sticky $s2]
}
代码说明:
结果:
中间按钮尺寸变大了,可见-sticky nsew的作用。如果是-sticky s则按钮不会放大,如果需要在窗口底部放置“确定”“取消”按钮,则用-sticky s,而不是-sticky nsew。