#

這一個章節介紹滑桿(刻度)視窗元件的使用方法。滑桿是一種控制數值和顯示數值的視窗元件,在之前的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等標準的視窗元件命令,它們的用法請參考這一章的說明。

2 個意見

isPeter | 2010年11月29日 下午5:33

hi Dai,

我有發現一個小錯誤,

本篇由上面數下來的第3個示範程式,的第1行:

"::val 0"

這是不是少了個 set ? ( set ::val 0 )

dai | 2010年11月30日 中午12:53

Hi isPeter

你的指定非常的有幫助,謝謝你哦。

留下您的意見

Theme Design by devolux.org. Converted by Wordpress To Blogger for WP Blogger Themes. Sponsored by iBlogtoBlog
This template is brought to you by : allblogtools.com | Blogger Templates