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的作用。