#

雖然說我們已經在之前的章節說明過核取方塊了,但說真的之前只是很粗略的介紹而以,所以我希望在這個章節多補充一些關於它的使用方法。我們會再次看到核取方塊的基本用法,當然也會多一些之前沒有的內容。

27.1 建立核取方塊

在ttk裡我們可以透過::ttk::checkbutton命令來建立方塊,例如下面的程式:

001
002
::ttk::checkbutton .chk -text "按一下" -offvalue 0 -onvalue 1 -variable ::value
pack .chk

上面的程式會建出1個核取方塊,-text用來設定顯示在核取方塊後的說明文字,-offvalue及-onvalue後面都可以是任意型式的數值或是字串,當使用者在把核取方塊打勾,-onvalue後面的值會被自動的儲存到::value變數裡,反之如果取消打勾-offvalue後面的數值就被儲存在::value變數裡。-variable後面可以指定一個變數的名稱,就如剛剛所說的指定在-variable後面的變數會即時反應核取方塊的狀態。

圖 27-1


這邊還有一另個重點,若建立核取方塊時-variable後面的變數是不存在的,這樣的話核取方塊會顯示成「alternate」狀態,即「供選取」狀態也就是使用者還沒有對核取方塊做任何操作的意思。在這個例子裡,我們並沒有預先設定::value變數的值,所以它會顯示成alternate狀態。

現在請大家想想,如果多個核取方塊的-variable都指定了相同的變數,那會有什麼情況發生? 像這面的例子:

001
002
003
::ttk::checkbutton .chk1 -text "打勾方塊1" -offvalue 0 -onvalue 1 -variable ::value
::ttk::checkbutton .chk2 -text "打勾方塊2" -offvalue 0 -onvalue 1 -variable ::value
pack .chk1 .chk2

這個例子讓兩個核取方塊產生了同步的效果,也就是對其中一個方塊打勾另一個方塊也會跟著變動,這樣看起來好像很好玩,不過事實上我們很少這麼使用,所以大家知道會有這樣的效果就好。

□ 把玩核取方塊

接下來讓我們看一個範例程式,這個程式會用上核取方塊大部份的功能,你玩一下應該就知道核取方塊該如何使用了。它長得像這樣:

圖 27-2


圖上的「查看狀態」每按一下都會輸出核取方塊目前的狀態。而其它的3個按鈕可以分別用來設定核取方塊的狀態,這是一種透過程式去控制核取方塊狀態的方法。 程式碼如下:

001
002
003
004
005
006
007
008
009
010
011
set ::value 1
ttk::checkbutton .chk -text "check1" -onvalue 1 -offvalue 0 -variable ::value

ttk::button .btnCheck -text "查看狀態" -command {puts $::value}
ttk::button .btnOn -text "On" -command {set ::value 1}
ttk::button .btnOff -text "Off" -command {set ::value 0}
ttk::button .btnAlt -text "Alternate" -command {unset ::value}

grid .chk - - -
grid .btnCheck .btnOn .btnOff .btnAlt


我想這邊只有一個地方要提醒,第一個grid後面的.chk - - -是表示.chk要佔用4格,也就是說「-」表示為前一個視窗元件的延伸。

□ 其它常用選項

以下是其它常用的選項,有興趣的朋友請自己試看看吧!!

-command 指定核取狀態變更時要執行的程式。
-image 設定核取方塊後面的圖示。
-compound 指定圖示及文字內容的排列方式。
-textvariable 這個選項可以指定一個變數來即時反應方塊後面的文字內容。

核取方塊也可供了cget及configure等標準的視窗元件命令,它們的用法請參考這一章的說明。

12 個意見

匿名 | 2011年12月9日 上午12:42

dai兄
我是crazystudent.tw@yahoo.com.tw
感謝你的協助,讓我進步蠻快的
想問一個問題,我現在寫了一個tcl的程式.在linux底下執行是用wish xxx.tcl 的指令
但我想放在定期排成crontab or cron.d 裡面,讓電腦時間到定時開啟我寫的tcl程式. 可是怎樣寫都不會執行.
指令如下,(command 部份該怎麼寫啊?)
10 5 * * * root (command)

另外,我有e-mail到你的信箱adai1115@yahoo.com.tw ,可你還沒回

dai | 2011年12月9日 上午8:33

Hi crazystudent,

抱歉!! 剛剛才在垃圾信中找出你寄給我的信,yahoo 垃報圾信真的...

匿名 | 2011年12月9日 上午11:28

我是crazystudent 發信箱到您的adai1115@gmail.com的那個
我開著msn 請儘速聯絡

Mary Lee | 2014年7月8日 下午6:00

dai大你好
我在checkbutton底下執行
::ttk::button .f3.btn2 -text "Save Config" -command {
puts $out "NVMe Basic Tests: $::value"
}
會出現"Error:can not find channel named "file6""的錯誤訊息,在checkbutton底下不能直接把輸出的內容存到檔案裡嗎???
謝謝!!

dai | 2014年7月8日 下午11:31

可以,也要確定 $out 是全域的,也許把$out都改為 $::out 就好了。

Mary Lee | 2014年7月9日 上午10:57

hi dai大
我試了把out改為$::out
可是一樣也是不行耶!!!出現一樣的錯誤訊息!

Mary Lee | 2014年7月9日 上午11:09

dai大
我發現我把最後一行"close $::out"拿掉就可以了!

Mary Lee | 2014年7月9日 下午1:58

可是不把檔案關掉不是會佔記憶體嗎???

dai | 2014年7月9日 下午10:40

把 close $::out拿掉就可以,是因為你原來的程式先把 close $::out 執行完,才執行 puts $::out "xxxx" (這是你按下按鈕才執行,但程式其實已經跑完最後一行)
也就是說你先把檔案關了才寫檔案,因此程式出錯!!!

檔案是需要關掉比較好,也許可以要寫另一個按鈕,確定所有檔案的讀寫動作都完成後,才執行關檔案的動作。

Mary Lee | 2014年7月10日 上午11:31

喔~原來如此!!
真是感謝dai大,一語驚醒夢中人呀~~

匿名 | 2015年7月12日 下午10:33

請問 我是在LINUX執行TK,不過出現
---------------------------------------------------------------------------------------------**
Error in startup script: invalid command name "::ttk::button"
while executing
"::ttk::button .btn2 -text "ttk���s""
-----------------------------------------------------------------------------------------------
他說我沒有這個指令,那我要怎麼在LINUX上加載這個指令?????????????

洪 銘澤 | 2016年8月10日 下午2:05

要如何透過value的設定 讓button直接顯示已經核取的狀態
主要是想判斷文件內的check list 然後用checkbutton顯示出哪些已經做過檢查了

留下您的意見

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