2016-07-07 22 views
0

ユーザが何らかの操作をしたくないときまで、メッセージボックスを継続的に表示するための簡単なスレッドを作成しました。以下はコードですTcl/tk - yesno messageBoxをスレッドで表示する方法

thread::create { while [tk_messageBox -message "Do you want to Exit?!!" -type yesno] { 
    doSomething 
}} 

スレッドが作成されても、メッセージボックスは表示されません。 どうすればこれらのメッセージボックスを実際に見ることができますか?

答えて

1

あなたはTkをスレッドにも存在させる必要があります。唯一のスレッドパッケージは下位のスレッドでデフォルトで存在している:

thread::create { 
    package require Tk 
    while [tk_messageBox -message "Do you want to Exit?!!" -type yesno] { 
     doSomething 
    } 
} 

はまた、あなたのコード内の他の問題の束を修正する必要があります。

  1. は常に
    {括弧}whileの条件を置きます。それがなければ、式の動的部分は一度しか評価されません。これは実際にはwhileで望むものではありません。
  2. スレッドが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を使用している場合は、コードをよりエレガントにするためにコルーチンを使用することができます。

+0

おかげドナルは - それがうまく働いて、ダイアログを開いたが、なしをクリックして上のコンテンツとのエラーダイアログボックスを示した試みたことは 『 を実行中 『標準出力 『 という名前のチャネルを見つけることができません』 stdoutが』doSomethingのを置く「という名前のチャネルを見つけることができません』スレッド本体に標準出力に参照する方法 (スクリプト「の後に」)」 任意のアイデアを「periodicallyMaybeDoSomething」 内から呼び出された (手順「periodicallyMaybeDoSomething」ライン5) – BabyGroot

関連する問題