這一個章節介紹滑桿(刻度)視窗元件的使用方法。滑桿是一種控制數值和顯示數值的視窗元件,在之前的MP3實作中曾經使用過它控制音樂的播發進度,這一個章節我們會對它的基本使用方法多些說明,也會示範一些不一樣的用法。
29.1 建立滑桿
建立滑桿的方法是使用ttk的scale命令,如下是一個建立滑桿的實例:001 002 | ::ttk::scale .scl -from 0 -to 100 -value 30 -variable ::val pack .scl -expand 1 -fill both |
這個例子建立了一個滑桿,然後設定滑桿可以控制的數值範圍是0(-from)到100(-to)、目前的值是30(-value),類似entry的-textvariable選項,滑桿也可以使用-variable選項指定一個變數的名稱來反映目前的值。下圖是程式執行的結果,滑桿的中間有一個可以拉的按鈕,使用者可以拉動這個按鈕,按鈕拉到最左邊表示為0,拉到最右邊表示為100,不管拉到哪::val永遠會記錄目前的數值。注意哦!! 滑桿的目前值是浮點數不是整數。
圖 29-1
下面是另一個例子,我讓scale及label使用了相同的變數來反應目前值,這讓可以即時查看滑桿的數值。
001 002 003 | ::ttk::scale .scl -from 0 -to 100 -value 30 -variable ::val ::ttk::label .lbl -textvariable ::val pack .scl .lbl -expand 1 -fill both |
執行起來像這樣:
圖 29-2
□ 使用範例
接下來我打算寫一個讓滑桿按鈕左右移動的範例,滑桿上的按鈕有每隔一段時間就向左或向右來回彈動,它的程式碼如下:001 002 003 004 005 006 007 008 009 010 011 012 013 | set ::val 0 set ::inc 5 proc timer {} { incr ::val $::inc if {$::val % 100 == 0} {set ::inc [expr 0 - $::inc]} after 100 timer } ::ttk::scale .scl -from 0 -to 100 -variable ::val ::ttk::label .lbl -textvariable ::val pack .scl .lbl -expand 1 -fill both timer |
這個程式的觀念很簡單,一開始的時候程式每隔一段時間就累加滑桿的數值,也就是累加::val的值,這樣滑桿上的按鈕看起來就會像向右方滑動。然後當::val的值加到100的時候就要改成每隔一段時間就減少滑桿的數值,一直到::val變0,這樣按鈕看起來就會像向左方滑動。然後再一直重複上面的兩個動作,按鈕就變成左右滑動了。
有了上面的觀念後,程式就不會太難懂了,首先::inc是滑桿移動的增量,一開始的時候::inc的值是5,所以每執行一次timer程序::val的值就會加5。接下來注意到timer裡的if命令,我的條件是「如果::val的值取100的餘數是0就反相::inc值的正負號」如些一來每次::val的值是0或是100的時候::inc的正負號就會反相,更簡單的說,一開始的時候::val會一直加正5,當::val加到100的時候,::inc變成負5,所以::val就變成一直減5,一直減到::val變0,::inc的值又變成正5,然後一直反覆這些動作。
□ 其它控制滑桿的方法
在上面的說明裡我們都是透過-variable指定的變數來取得滑桿的數值,但事實上除了這個方法之外,還有其它的法方可以存取滑桿的目前值,接下來分別說明這些方法。滑桿的-command選項,也可以用來取得滑桿的目前值,它的運作方式很像button視窗元件的-command選項,一樣是在-command後面接上程序,不同的是button的-command所指定的程序是按下按鈕時執行,而滑桿所指定的則是在使用者拉動按鈕時執行。下面是一個簡單的例子可以用來說明-command的用法:
001 002 003 004 005 | proc show {val} { puts $val } ::ttk::scale .scl -from 0 -to 100 -command {show} pack .scl -expand 1 -fill both |
這個例子的重點在於tk會自動把滑桿的目前值當作參數然後傳給-command後面指定的程序,也就是說加在-command後的程序要在參數串列中接下傳入的值。
□ scale常用的命令
scale常用的視窗元件命令只有兩個,它們分別是用來取得目前值的get命令,例如像這樣:000 | puts [.scl get] |
以及用來設定目前值的set命令:
000 | .scl set 50 |
這個例子可以用程式把滑桿的目前值設定為50,而不需要使用者真的去拉滑桿按鈕。
□ 其它常用選項
以下是其它常用的選項,有興趣的朋友請自己試看看吧!!-length | 指定滑桿水平放置時的長度或垂直放置時的高度。 |
-orient | 設定滑桿的樣式horizontal(水平)或vertical(垂直)。 |
滑桿也提供了cget及configure等標準的視窗元件命令,它們的用法請參考這一章的說明。
按右上方的「#」號切換側邊欄