1

フローの進行のために完了する必要がある小さな GUI を作成しています。私が望むのは、GUI を作成し、GUI が閉じられたときに 1 または 0 を返す proc を作成し、次のようにフローを続行することです。

first part of the code
...
...
if {![open_gui]} {
    return
}
second part of the code
...
...

GUI は、保存ボタンとキャンセル ボタンを備えた単純な 3 つのエントリです。保存ボタンが押された場合、いくつかの値がデータ モデルに格納され、関数はキャンセル ボタンが押された場合、または GUI が閉じられた場合に 1 を返します。ウィンドウを閉じても何も起こらず、proc は 0 を返します。

これは可能ですか?

今私がしたことは、コードを 2 つのピースに分割することです (code_part_1およびcode_part_2) 最初の部分を実行してから、GUI を開き、保存ボタンで 2 番目の部分を呼び出し、キャンセルすると GUI が閉じます。

code_part_1
open_gui_split

そして機能open_gui_splitは次のとおりです。

proc open_gui_split {} {
    # ...
    set save_b [button $win.save_b -text save -command [list code_part_2]
    # ...
}

* - 提示されたすべてのコードはアーキテクチャの表現にすぎず、実際のコードではありません。

4

1 に答える 1

3

Tk GUI を実行し、ユーザーからの応答を待ってその値を返すコマンドを作成することは完全に可能です。それを行うための鍵は、次のtkwaitコマンドです。

proc popUpButton {w} {
    toplevel $w
    pack [button $w.b -text "push me" -command [list destroy $w]]
    # This waits in the event loop until $w is destroyed...
    tkwait window $w
    return "button was pushed"
}

puts "about to pop up the button"
puts ">>[popUpButton]<<"
puts "popped up the button"

tkwait次の 3 種類があります。

  1. tkwait window $w$wウィンドウが破棄されるのを待ちます。
  2. tkwait visibility $wウィンドウが表示されるのを待ち$wます (ただし、Unix/X11 以外のプラットフォームでは動作しません)。
  3. tkwait variable $varname$varname変数が設定されるのを待ちます。それはプレーンな Tcl のようなものですvwait(実際、もともとvwait tkwait variableイベント ループが Tcl に統合される前でした)。

イベント ループに再度入るとスタックの深さが増し、注意しないとコードが非常に混乱する可能性があることに注意してください。おそらく、ユーザーがポップアップしたダイアログのみと対話するようにするには、 を使用focusしたいと思うでしょう。grab

最後に、これがどのように機能するかのより完全な例を確認するには、ソースをtk_dialog見てください(これは、Tk 8.4.19 のバージョンであり、私たちのリポジトリから直接入手したものです)。後です。これは、私が書きたいよりもはるかに完全に機能する例であり、ユーザー入力に基づいて返される値を取得する方法などを示しています。

于 2013-03-06T10:36:58.220 に答える