1

Tclを学び始めたばかりです。簡単な手順を書きたかったのです。手順が開始されると、ファイルを参照するための参照ウィンドウが開きます。そこで、開きたいファイルを選択できます。

次に、ポップアップ ウィンドウが表示され、別のファイルを選択するかどうか尋ねられます。選択したすべてのファイルは配列に入る必要があります。

次のコードが必要です:

########## Defining the sub procedures ############
proc open_file {} {
    set n 0
    set title "Select a file"
    set types {
      {{GDS files} {.gds} }
      {{All Files} * }
    }

    set filename [tk_getOpenFile -filetypes $types -title $title]

    set opendFiles($n) $filename
    set n [expr $n + 1]

    set answer [tk_messageBox -message "Load another GDS file?" -type yesno -icon question]
    if {$answer == yes } {
       open_file
    } else {
       show_files ($opendFiles)
    }
}

proc show_files {} {
    foreach key [array names opendFiles] {
        puts $opendFiles($key)
    }
}

########## Main Program ###########
open_file

私は次の問題を抱えています。私は常に proc を思い出すのでopen_file、変数は '' に$n設定し続けます0。しかし、サブルーチン全体をリコールせずにウィンドウの開始をリコールする方法がわかりません....

2 番目の問題は、配列を次の proc に送信することです。proc ' show_files' に送信すると、常に次のエラー : が発生しますcan't read "opendFiles": variable is array

私は両方の答えを見つけることができないようです..

4

3 に答える 3

1

そのためにはグローバル変数が必要です。これは私のために働く:

########## Defining the sub procedures ############
set n 0
array set openedFiles {}

proc open_file {} {
    set title "Select a file"
    set types {
        {{GDS files} {.gds} }
        {{All Files} * }
    }

    set filename [tk_getOpenFile -filetypes $types -title $title]

    set ::openedFiles($::n) $filename
    incr ::n

    set answer [tk_messageBox -message "Load another GDS file?" -type yesno -icon question]
    if {$answer == yes } {
        open_file
    } else {
        show_files
    }
}

proc show_files {} {
    foreach key [array names ::openedFiles] {
        puts $::openedFiles($key)
    }
}

########## Main Program ###########
open_file

配列の問題

Tcl では、配列を proc に送信できません。array getこのリストを proc に送信してそれらをリストに変換し、次に で再度配列に変換する必要がありますarray set

于 2013-05-24T08:50:59.817 に答える
0

変数の状態がプロシージャの呼び出し間で保持されるようにするには、その変数をプロシージャの外で有効にする必要があります。最も簡単な方法は、グローバル変数を使用することです。

# Initialize it...
set n 0
proc open_file {} {
    # Import it...
    global n
    ...
    # Use it...
    set openedFiles($n) $filename
    incr n
    ...
}

配列は値ではないため、別のプロシージャに直接渡すことはできません。これを処理するには、名前を渡し、使用upvar 1してローカル エイリアスを呼び出し側スタック フレームの変数にリンクします。

proc show_files {varName} {
    upvar 1 $varName ary
    foreach key [array names ary] {
        puts $ary($key)
    }
}

これは配列の名前を使用して呼び出されるため、いいえ$

show_files openedFiles

(配列のシリアライズをシリアライズarray get openedFilesおよびarray set ary $serializationデシリアライズに渡すこともできますが、これにはオーバーヘッドが伴います。)

おそらく、そのopenedFiles変数をglobal行に追加して、すべての呼び出しで永続化されるようにする必要がありopen_fileます。

于 2013-05-24T14:21:17.067 に答える