0

これにはまだ慣れていないので、解決できない興味深い問題を自分で作成しました...

ユーザーが既存の文字列を編集できる独自の「ポップアップ」ボックスを設計しようとしています。ボタンを押すとポップアップし、入力ボックスに文字列が表示されます。ユーザーが文字列を編集したら (または編集しなくても)、[OK] ボタンをクリックすると、ボタンが消え、スクリプトに新しい文字列が追加されます。

私のアプローチは次のようなものです:

ボタンを押すと、3 つのウィジェットを含むトップレベル ウィンドウが作成されます。

  • 単純なラベル「文字列を編集します。完了したら [OK] を押してください」;
  • 定義済みの文字列を含む編集可能なエントリ。
  • 押されたときにトップレベルウィンドウを破棄するボタン「OK」。

私はそれを機能させましたが、編集された文字列を取得する方法がわかりません。

私の根本的な問題は、「イベント駆動型」の用語で考えていないことだと認識しています。これは簡単に実行できるはずですが、この時点では森が見えません。

私は何が欠けていますか?私はこれを複雑にしすぎていますか?

#!/usr/bin/wish

# Create the Pop-up box
proc popUpEntry { labelString } {
  global myString

  puts "POP:myString = $myString"

  set top [toplevel .top]
  set labelPop [label $top.labelPop -text $labelString ]
  set entryPop [entry $top.entryPop -bg white -width 20 -textvar $myString ]
  set buttonPop [button $top.buttonPop -text "Ok" -command { destroy .top } ]

  pack $labelPop
  pack $entryPop
  pack $buttonPop
}

# Pop-up command
proc DoPop {} {
  global myString

  set popUpLabel "Edit string, press ok when done:"
  puts "Before: myString = $myString"  
  popUpEntry $popUpLabel
  puts "After: myString = $myString"
}

# Initalize
set myString "String at start"

# Pop-up button invokes the pop-up command
set buttonPop [button .buttonPop -width 10 -text "Pop" -command {DoPop} ]
pack $buttonPop

#
4

2 に答える 2

2

この行で:

set entryPop [entry $top.entryPop -bg white -width 20 -textvar $myString ]

entryコントロールを変数-textvar内容に設定していますmyString

$シンボルを削除して、変数自体に設定する必要があります。

set entryPop [entry $top.entryPop -bg white -width 20 -textvar myString ]
于 2012-08-03T02:07:51.150 に答える
0

-textvar $myString に加えて、popUpEntry 関数はポップアップが作成された直後 (ユーザーが何か新しいものを入力する機会を得る前) に戻るため、コードは機能しません。

ポップアップが閉じるまで待つ必要があります。これは、popUpEntry の別のグローバル変数で行うことができます。

...
global popup_closed
...
set buttonPop [button $top.buttonPop -text "Ok" -command {
      set edit_ready 1 
      destroy .top
      }

...

set edit_ready 0
popUpEntry $popUpLabel
vwait edit_ready
于 2016-06-27T20:59:45.413 に答える