#

單行輸入方塊是視窗程式設計最常用的元件之一,它可以讓使用者在視窗程式上輸入一行文字,然後達成程式與使用者互動的目的。這一篇文章會簡單的介紹單行輸入方塊的使用方法。

19.1 建立單行輸入方塊

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



這個程式很簡單的建立了一個單行輸入方塊(entry),而且我們使用了-textvariable選項讓::txt變數來反映entry輸入區的內容。也就是說只要修改::txt變數,那麼entry輸入區的內容就會跟著改變,反過來說如果讀取::txt的值,那麼就可以取得entry輸入區裡的內容。這個例子我們以前看過好多次了,所以偷懶一下不貼圖了,請大家自己執行看結果。

□ 密碼輸入方塊

entry元件的-show選項可以用來設定密碼字元,也就是把entry元件變成輸入密碼的欄位。你可以把任何一個字元設定給-show選項,如此一來entry就會用你設定的字元來遮住真正的內容。



請注意到第2行,因為我把「#」指定給-show選項,所以原本應該顯示為「Hello」的,現在全都顯示成「#」符號了。請看下面的執行畫面:

圖 19-1


「Hello」都被「#」號遮住了。

19.2 視窗元件命令

entry除了提供cget及configure等標準的視窗元件命令之外,另外還提供了幾個命令,讓你不用透過-textvariable指定的變數,也可以設定或取出輸入區的內容。現在讓我們先來看看下面的例子:



請先看到程式的第1行,這次沒有指定-textvariable,所以現在沒有辦法透過某個變數來改變輸入區的內容了。然後請看到第2行,我改用了insert命令來把「Hello」字串插入輸入區最尾端end的位置,程式執行起來像這樣:

圖 19-2


程式第2行的end是你要插入的位置,後面的「Hello」是要插入的內容。對於插入的位置你也可以用零以上的數值來表示,例如:



在第3行我把一個笑臉插入輸入區0的位置(即最前面),所以這次程式執行起來像這樣:

圖 19-3


entry的insert命令除了可以用end及零以上的數值來表示插入位置之外,也可以用下面的方法來把字串插入目前滑鼠停駐點的位置:



□ 取得輸入區的內容

在上面的例子裡,我們沒有指定-textvariable選項,那該怎麼取得輸入區裡的內容呢? 簡案是使用entry的get命令:



這個程式的重點在第4行,請看到-command裡的內容我用了entry的get命令來取出輸入區的內容,然後把它輸出。

□ 反白輸入區裡的內容

entry也提供了命令來反白輸入區裡的文字內容,例如:



請注意到第3行,entry的selection range命令可以用來反白輸入區裡的文字內容,以這個例子來說,我從索引值1選到4,總共選了3個字元,不包含索引4的字元。所以它執行的畫面如下,有3個字元被反白了。

圖 19-4


如果要反白全部的內容,則可以這樣寫:



當然也有清除反白的命令:

21 個意見

Tom | 2010年9月29日 下午5:32

你好,我若要在輸入方塊中取得輸入的值,並更新我副程式某個變數的值,我要怎麼寫才對?
還有一個問題是,我想使用incr p 0.1 ,但一直都會出現錯誤,怎麼使用小數點,謝謝

sam | 2010年9月30日 下午1:59

Hi Tom:

我查了一下incr的定義:
Increments the value stored in the variable whose name is varName.
The value of the variable must be an "integer".
增數只能為整數喔。

另外,在輸入方塊中取得輸入的值,並更新副程式某個變數的值,
你可以將欄位的值傳給副程式,再將此值更新到"某個變數",
或者你直接將"某個變數"的值設為全域變數,
範例如下:

ttk::label .lblNum1 -text "輸入第一個數字:"
ttk::entry .txtNum1 -textvariable txtNum1
ttk::label .lblNum2 -text "輸入第二個數字:"
ttk::entry .txtNum2 -textvariable ::txtNum2
ttk::button .btnResult -text "看結果" -command {
set sum [sum_proc $txtNum1];
puts $sum;
}
pack .lblNum1 .txtNum1 .lblNum2 .txtNum2 .btnResult

proc sum_proc {tn1} {
return [expr $::txtNum2 +$tn1]
}

我不知道我是不是有誤解你的意思,但希望有幫到你的忙。

Tom | 2010年9月30日 下午4:14

謝謝大大幫忙,
1.但我還有問題就是你上面寫的那個如果沒有輸入就按結果,會有問題說,要怎麼改?
2.如果是更新的變數是副程式的source demo.tcl 的 demo變數要怎麼改?
3.我在使用 ::ttk::button .btn -text "get" -command {puts [$::name get]}
$fme.txt insert end "$::name" ]} 後,=>是正常
但我怎麼清除我剛剛輸入的內容,而不是反白的內容?
4. incr真的不能用小數點的話,如果我要在for迴圈中要每次增加0.5或減少0.5要怎麼克服?
請幫幫我~

dai | 2010年10月10日 下午1:25

Hi Tom

請試試下面的程式

set ::txt ""

ttk::label .lblNum1 -text "請輸入檔名:"
ttk::entry .txtNum1 -textvariable ::txt
ttk::button .btnResult -text "執行" -command {test}
pack .lblNum1 .txtNum1 .btnResult


proc test {} {
if {$::txt == ""} {
puts "檔名不可以是空白!!"
return
}
if {![file exists ${::txt}.tcl]} {
puts "檔案不存在"
return
}

source ${::txt}.tcl

for {set i 0} {$i<=10} {set i [expr $i + 0.5]} {
puts $i
}
}

另外如果想要清除某個文字方塊裡的內容,只要文字方塊-textavriable後面的變數設定為空字串就行了,例如:

set ::txt ""

米粒 | 2011年3月24日 下午8:18

當然也有清取反白的命令
清"取"應該是清"除"喔~

匿名 | 2012年7月9日 下午8:05

您好:
我想請問一下
如果要把entry中的內容拿出來做應用該怎麼辦?
例如說做一個讓人輸入英文名字的entry,然後把輸入的名字字首轉為大寫再輸出,該怎麼做?
謝謝

dai | 2012年7月10日 下午10:39

請參考本篇文件中間部份"取得輸入區的內容".

匿名 | 2013年4月15日 下午2:20

dai 請教下
entry 好像無法用滑鼠右鍵??
例如 我在別處有複製文字
我想要在entry 直接右鍵 貼上
倒是Ctrl+v正常
不暁得如何做起??
謝謝

dai | 2013年4月15日 下午3:24

請參考第34章 34.4 的內容

匿名 | 2013年4月15日 下午4:40

謝謝dai回答 看來要來研究window clipboard 怎麼共用
另外在請教下
在做GUI介面會有一些entry與button
目前可以做到隨著視窗變大而放大
但是縮小的時候 是否可以指定使用滑鼠縮小最低限度
免得縮到最小時 entry或者button 都不見了

dai | 2013年4月15日 下午11:33

可以使用以下的語法
wm minsize window ?width height?

ex.
wm minsize . 300 200

匿名 | 2013年4月16日 上午11:02

原來是用wm
多謝dai的教學與熱心的解答
在這裡真的是受益良多

Jarry_Chang | 2013年9月24日 下午4:27

請問大大,

我 pack 一個 entry 並預設一個字串
並且指定 focus 到 entry
請問我要如何設定 focus 才可以把 focus 指定到字串的中間

set ::var "ABCD"
ttk::entry .ety -textvariable ::var
pack .ety
focus .ety

Jarry_Chang | 2013年9月24日 下午4:40

大大,
我發現 icursor 可以作到

Jarry_Chang | 2013年9月25日 下午3:26

大大,

請問如何設定 Entry 內輸入的字 的字體大小

我這樣設定都沒有效果
ttk::style configure MyExample.TEntry -font [font actual "Courier 14 bold"]

Jarry_Chang | 2013年9月30日 上午11:38

大大,
我發現直接在建立 ttk::entry 的時候 設定 -font [font actual "Courier 14 bold"] 就可以了

Jarry_Chang | 2013年10月2日 下午4:43

大大,
請問 ttk::entry 在 Windows XP 環境下的背景顏色要如何設定
我在Linux 的環境使用 ttk::style configure False.TEntry -fieldbackground #ff0000
可以成功設定顏色
但是我在 XP 只能改變字體的顏色無法設定 entry 的背景顏色

Kenneth | 2014年4月16日 下午1:30

Dai 大大,
謝謝您精美的教材,有問題請教您
是否可限定 entry 的輸入內容,
ex 限制使用者只能輸入整數、浮點數 or 字串.

謝謝

dai | 2014年4月17日 上午10:05

嗯 ~ 預設的entry沒有這樣功能,需要自己寫程式來裡面。

jimmy | 2014年4月22日 下午10:37

可以搭配 validatecommand 這個option使用

pack [ttk::entry .en -validatecommand [list check %S] -validate key]

proc check {key} {
if [string is integer $key] {
return 1
} else {
return 0
}
}

Kenneth | 2014年4月24日 下午3:57

謝謝 Jimmy,
使用上發現要將 -validatecommand [list check %S] 的 %S 改為 %P,方可更改 entry輸入內容。

留下您的意見

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