外表是很重要的,程式寫得再好,外觀醜的話還是沒人想用 XD 所以現在我也開始改用 Tile 來畫 gui 了。從 Tk 8.5 後就內建 Tile,常見的 widget 都有提供,用 Tile 最大的好處是可以藉由更換 theme 得到與各平台風格相同的外觀,如 windows/linux/mac (可參考 wiki 上的 Applications using Tile),這樣就不會讓人一看就知道是用 tk 寫的程式 (原本真的蠻醜的)。雖然內建在 tk 8.5 中,但還有很多尚未定案的部份,也就是說還在開發中,這也使得文件有公開說明的部分非常少,有些較舊的文件中提到的語法也無法用了。觀念和用法可看 TkDocs 上寫的,這是我目前找到最詳細的資料,這篇主要是記錄這陣子試出的心得,希望寫程式的宅男即使交不到漂亮女友至少可以寫出漂亮的程式 XD
Tile 目的是要跟各平台外觀相同,這也使得目前的自由度很低,無法任意組合出想要的 widget,看討論區也不知道開發團隊以後會不會往更自由的方向發展,現在只好先以現有的功能拼湊出想要的 widget。之前大都用 BWidge,換成 tile 後發現很多效果做不出來 orz 找了很多資料後目前總算可以擺脫 BWidge。(再嘆一次,manual上的資料實在是太少了)
以下是最近的心得,以後有新的再補充。
圓角 flat button
我在 toolbar 上的 button 會用 -relief flat 但 ttk::buttion 沒提供這 option,manual 上也沒寫到怎麼做,google 許多資料後發現有不同的方法可以達成,不過最簡的方法是加上 -style Toolbutton 即可,原本用 BWidget 畫出來的是方的,現在用 tile 可以畫出圓角的了。
ttk::button .b -style Toolbutton -image $imgs(btn_home)
圖示 entry
現在 entry 中沒圖示好像就遜掉了 XD,Tile 目前只能自建 image element
ttk::style element create searchEntryIcon \
image $imgs(e_search) -sticky {} -border 10 -width 20
再把它插入 entry中
ttk::style layout SearchEntry {
Entry.field -children {
searchEntryIcon -side left
Entry.padding -children {
Entry.textarea
}
}
}
以後指定 style 即可使用
ttk::entry .e1 -style SearchEntry
效果像這樣
ScrolledWindow
在用 treectrl 時常把 tree丟到 BWidget 的 ScrolledWindow 中,以下是用 Tile 做出來的 (還沒加上自動隱藏 scrollbar)
package require treectrl
set fmeMain [ttk::frame .fmeMain]
set scv [ttk::scrollbar $fmeMain.scv -orient vertical ]
set sch [ttk::scrollbar $fmeMain.sch -orient horizontal ]
set t [treectrl $fmeMain.tree \
-usetheme 1 \
-relief groove \
-bd -0 \
-highlightthickness 0 \
-xscrollcommand [list $sch set] \
-yscrollcommand [list $scv set]
]
set columnID [$t column create -text test]
$t element create elemBorder border -background white \
-filled yes -relief solid -thickness 1
$t element create elemText text
$t style create style1
$t style elements style1 {elemBorder elemText}
$t style layout style1 elemBorder -union elemText -ipadx 4 -ipady 4
$t style layout style1 elemText
for {set i 1} {$i <= 30} {incr i} {
set itemID [$t item create]
$t item style set $itemID $columnID style1
$t item element configure $itemID $columnID elemText -text "Item $i"
$t item lastchild root $itemID
}
grid $t -row 0 -column 0 -sticky news
grid $scv -column 1 -row 0 -sticky ns
grid $sch -column 0 -row 1 -sticky ew
grid columnconfigure $fmeMain 0 -weight 1
grid rowconfigure $fmeMain 0 -weight 1
$scv configure -command [list $t yview]
$sch configure -command [list $t xview]
pack $fmeMain -fill both -expand 1