2011-07-29 9 views
3

私は自動テスターを制御するTclスクリプトを持っています。これまでのところ、コマンドプロンプトでユーザーの入力を受けたコンソールプログラムでした。同僚がスクリプトで起動できるTk GUIを書きました。私は自分自身でTkを使ったことは一度もなかったので、多くの構文を理解していません。Tcl/Tk bindにはグローバル変数が必要ですか?

テストの開始時に、スクリプトはオペレータからユニットシリアル番号を取得する必要があります。

proc GetSerialNumber {} { 
global gUserInterfaceBarCode 

DisplayMessage "Enter serial number:" 

.c.serialnumberbox configure -state normal 

focus .c.serialnumberbox 

bind .c.serialnumberbox <Return> { set gUserInterfaceBarCode [.c.serialnumberbox get] } 

tkwait variable gUserInterfaceBarCode 

#grid forget .c.serialnumberbox 

.c.serialnumberbox configure -state disabled 

} 

DisplayMessageは単にGUI上のテキストラベルを更新するプロシージャです:これは私の同僚はそれを行うために書いた関数です。

シリアル番号を保持するために使用されるグローバル変数gUserInterfaceBarCodeがあるのは気に入らないのですが。代わりにローカル変数を使用してプロシージャにその値を返す方法はありますか?

私が正しく理解していれば、tkwait variable gUserInterfaceBarCodeという行が取り出されると、その変数が変更されるまでブロックされません。これは、GUI要素からのユーザー入力を取得する最善の方法ですか?

答えて

6

基本的には、待機する変数が必要です。残念なことに、<Return>のコードは、あなたのproc内のコードとは異なるコンテキスト(グローバルコンテキスト)で実行され、そのコードがあなたのproc内のローカル変数に対処する方法はありません。

しかし、それはグローバル変数を持つ必要はありません。それだけではグローバルにアドレス可能である必要があります。つまり、名前空間変数を使用することができます。

namespace eval GetSerialNumber { 
    proc GetSerialNumber {} { 

     DisplayMessage "Enter serial number:" 
     .c.serialnumberbox configure -state normal 
     focus .c.serialnumberbox 
     bind .c.serialnumberbox <Return> { set ::GetSerialNumber::result [.c.serialnumberbox get] } 
     tkwait variable ::GetSerialNumber::result 
     .c.serialnumberbox configure -state disabled 
     return $::GetSerialNumber::result 
    } 
} 

set serialNum [GetSerialNumber::GetSerialNumber] 

別の方法としては、明示的に返す前gUserInterfaceBarCodeを削除するには、次のようになります。

tkwait variable ::gUserInterfaceBarCode 
set result $::gUserInterfaceBarCode 
unset ::gUserInterfaceBarCode 
return $result 

を何が価値があるため、Tkのコアの実装は、「オープンのように、内蔵されたダイアログの実装、独自の名前空間のアプローチを使用していますファイル]ダイアログボックスを開きます。

+1

Tkスクリプトは、スコープを扱うのが簡単な独自のヘルパープロシージャでは、何かを曖昧にすることさえあります。 –

+0

ほとんどのTcl OO拡張では、オブジェクトインスタンス変数が名前空間変数のように見えるため、OO拡張を使用して変数をもう少しカプセル化することもできます。 3番目の方法は、各値に対して1つの変数名を使用する代わりに、すべての状態に対して1つのグローバル配列変数を使用することです。 – schlenk

関連する問題