あなたはTkをスレッドにも存在させる必要があります。唯一のスレッドパッケージは下位のスレッドでデフォルトで存在している:
thread::create {
package require Tk
while [tk_messageBox -message "Do you want to Exit?!!" -type yesno] {
doSomething
}
}
はまた、あなたのコード内の他の問題の束を修正する必要があります。
- は常には
{
括弧}
にwhile
の条件を置きます。それがなければ、式の動的部分は一度しか評価されません。これは実際にはwhile
で望むものではありません。
- スレッドが
thread::wait
であることを確認してください。プロセスとスレッドの管理が改善されるためです。メッセージボックスのループを完全に書き直す必要があります。
これは、このコードにつながるかもしれない:
thread::create {
package require Tk
proc periodicallyMaybeDoSomething {} {
if {[tk_messageBox -message "Do you want to Exit?!!" -type yesno]} {
thread::exit
}
doSomething
# pick a better delay maybe?
after 1 periodicallyMaybeDoSomething
}
after 1 periodicallyMaybeDoSomething
thread::wait
}
あなたが8.6を使用している場合は、コードをよりエレガントにするためにコルーチンを使用することができます。
おかげドナルは - それがうまく働いて、ダイアログを開いたが、なしをクリックして上のコンテンツとのエラーダイアログボックスを示した試みたことは 『 を実行中 『標準出力 『 という名前のチャネルを見つけることができません』 stdoutが』doSomethingのを置く「という名前のチャネルを見つけることができません』スレッド本体に標準出力に参照する方法 (スクリプト「の後に」)」 任意のアイデアを「periodicallyMaybeDoSomething」 内から呼び出された (手順「periodicallyMaybeDoSomething」ライン5) – BabyGroot