私は自動テスターを制御する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要素からのユーザー入力を取得する最善の方法ですか?
Tkスクリプトは、スコープを扱うのが簡単な独自のヘルパープロシージャでは、何かを曖昧にすることさえあります。 –
ほとんどのTcl OO拡張では、オブジェクトインスタンス変数が名前空間変数のように見えるため、OO拡張を使用して変数をもう少しカプセル化することもできます。 3番目の方法は、各値に対して1つの変数名を使用する代わりに、すべての状態に対して1つのグローバル配列変数を使用することです。 – schlenk