0

私は GUI が初めてで、tcl で簡単な GUI を作成しようとしていました。押すとコードが実行され、ディレクトリに出力「.l」ファイルが生成されるプッシュボタンがあります。しかし、GUI自体に出力を印刷したいのです。だから、このコードを変更してタスクを実行するにはどうすればよいですか。

proc makeTop { } {
    toplevel .top ;#Make the window
    #Put things in it
    label .top.lab -text "This is output Window" -font "ansi 12 bold"
    text .top.txt 
    .top.txt insert end "XXX.l"
    #An option to close the window.
    button .top.but -text "Close" -command { destroy .top }
    #Pack everything
    pack .top.lab .top.txt .top.but
}

label .lab -text "This is perl" -font "ansi 12 bold"
button .but -text "run perl" -command { exec perl run_me }
pack .lab .but

GUI自体に出力フ​​ァイルXXX.lの内容を表示するのを手伝ってくれる人はいますか???

4

1 に答える 1

0

結果を stdout に出力するだけの単純なプログラムの場合、それは簡単ですexec。プログラムのすべての標準出力を返します。execしたがって、呼び出しの戻り値を読み取るだけです。

proc exec_and_print {args} {
    .top.txt insert end [exec {*}$args]
}

ただし、 exec はプログラムが終了した後にのみ戻ることに注意してください。出力をテキストボックスにすぐに表示したい長時間実行プログラムの場合は、 を使用できますopen。に渡さopenれたファイル名の最初の文字が である場合、その文字列は実行するコマンド ラインであると見なされます。これにより、継続的に読み取ることができる i/o チャネルを取得できます。|openopen

proc long_running_exec {args} {
    set chan [open "| $args"]

    # disable blocking to prevent read from freezing our UI:
    fconfigure $chan -blocking 0

    # use fileevent to read $chan only when data is available:
    fileevent $chan readable {
        .top.text insert end [read $chan]

        # remember to clean up after ourselves if the program exits:
        if {[eoc $chan]} {
            close $chan
        }
    }
}

上記のlong_running_exec関数はすぐに戻り、イベントを使用して出力を読み取ります。これにより、外部プログラムの実行中に GUI がフリーズするのではなく、機能し続けることができます。それを使用するには、次のようにします。

button .but -text "run perl" -command { long_running_exec perl run_me }

追加の回答:

プログラムが出力としてファイルを生成し、単にファイルの内容を表示したい場合は、ファイルを読み取るだけです。

proc exec_and_print {args} {
    exec {*}$args

    set f [open output_file]
    .top.txt insert end [read $f]
    close $f
}

ファイルが生成された場所はわかっているが、正確なファイル名がわからない場合はglob、ディレクトリの内容のリストを取得する方法についてのマニュアルを読んでください。

于 2012-09-26T07:16:20.620 に答える