2017-07-25 1 views
0

私はtclで初心者でtkで初心者にはうってつけです。 いくつかのテキストをウィンドウに表示したいのですが、いくつかの検索の後に、私にはうってつけの例があります。 私の問題は、ディスプレイがリアルタイムではなく、プログラムが終了したときだけです。 ここに私のプログラムのメインラインがあります。端末のテキストがtcltkウィンドウにリアルタイムで表示されない

Main_program.tcl

#!/bin/sh 
# -*- tcl -*- 
# The next line is executed by /bin/sh, but not tcl \ 
exec /usr/local/Cellar/tcl-tk/bin/tclsh "$0" "[email protected]" 

set DEBUG 1 

source ./GUI_mgt.tcl 
source ./utils.tcl 

for {set i 0} {$i<500} {incr i} { 
    after 10 
    debug_puts $i 
} 

utils.tcl

proc debug_puts {message} { 
    if {$::DEBUG} { writeToLog $message } 
} 

GUI_mgt.tcl

package require Tk 
grid [text .log -state disabled -width 80 -height 24 -wrap none] 

proc writeToLog {msg} { 
    set numlines [lindex [split [.log index "end - 1 line"] "."] 0] 
    .log configure -state normal 
    if {$numlines==24} {.log delete 1.0 2.0} 
    if {[.log index "end-1c"]!="1.0"} {.log insert end "\n"} 
    .log insert end "$msg" 
    .log configure -state disabled 
} 

は、質問:何が間違っているか、このコードで逃しましたか? 文章を別のウィンドウに表示するために使用できるパッケージや例が分かりますか?

注:私はMacOSのシエラ10.12.5

答えて

2

あなたのテストプログラムはイベントドリブン形式で書かれていない上でのTclのtk 8.6.6を使用するので、画面の更新に問題が悪化しています。

ステートメントはプログラムをハングし、イベントループの再入力を許可しません。唯一のテストの目的のために、試してみてください。代わりにafter 10コマンドの

set ::w10 0 
after 10 [list set ::w10 1] 
vwait ::w10 

を。ネストされたvwait'sは期待どおりに動作しないため、vwaitコマンドの使用は通常推奨されません。

非常にビジーなループがある場合、Tkプログラムは決してイベントループを再入力することができず、ディスプレイは決して更新されません。

最も簡単な解決策は、writeToLog手順の最後に

update 

文を置くことです。これは常にこのタイプの問題を処理する最善の方法ではありませんが、機能します。

また、ログメッセージが書き込まれるたびにウィンドウを再描画する必要があるため、ループが遅くなります。

別の方法として、計算プロセスを別のスレッドまたはプロセスに入れて、メインGUIプロセスにステータス更新を送信する方法があります。

+0

Bradさん、ありがとうございました。 別のスレッドで2番目のアイデアを試してみます。私はたくさん好きなアイデアです。 –

関連する問題