0

コピー/貼り付け用にテキストを選択できるラベルを作成したいと思います。これを行うために、読み取り専用のエントリを使用しようとしました。しかし、それらのテキスト値を初期化できないようです。ラベルはループ内で生成され、ラベルの数とその内容は不明です。ラベルを作成するためのコードは次のとおりです。

proc test_labels {} {
    toplevel .labels
    # Main Frame
    frame       .labels.main_frame -relief "groove" -bd 2
    pack        .labels.main_frame

    set r 1

    foreach t [list banana apple grapes orange lemon peach] {
        set lbl  [label .labels.main_frame.lbl_$r   -text "fruit $r:"]
        set lbl2 [label .labels.main_frame.val_$r -text $t]

        grid $lbl  -row $r -column 1 -sticky nse
        grid $lbl2 -row $r -column 2 -sticky nsw

        incr r
    }
    set ok_btn [button .labels.main_frame.ok_b -text "OK" -command {prop_menu_ok_button}]
    grid $ok_btn -row [expr $r+2] -column 1 -columnspan 2 -sticky nsew

    grab release .
    grab set .labels
    center_the_toplevel .labels
    bind .labels <Key-Return> {test_labels_ok_button}
}

そして、それは休閑ウィンドウを作成します:

ここに画像の説明を入力してください

次に、その行を次の行に置き換えようとしset lbl2 [label .labels.main_frame.val_$r -text $t]ます。

eval "set text_val_$r $t"
eval "set lbl2 [entry .labels.main_frame.val_$r -relief flat -state readonly -textvar text_val_$r]"

しかし、これは空の行を作成するだけです:

ここに画像の説明を入力してください

エントリウィジェットにデフォルト値を設定するにはどうすればよいですか?

質問に関連するTkラベルのテキストを選択可能にするにはどうすればよいですか?

4

1 に答える 1

2

これらの線はほぼ間違いなくあなたが望むものではありません!(を使用している場合はeval、それが本当に必要かどうかを常に確認する必要があります。8.5以降では、「必要ない」と答えられる可能性があります。)

eval "set text_val_$r $t"
eval "set lbl2 [entry   .labels.main_frame.val_$r -relief flat -state readonly -textvar \$\{text_var_$r\}]"

の使用とは別に、重要な問題evalは、-textvariableオプションが変数の名前をとることです。配列を使用して値を保持することにより、これを修正しましょう。

set text_val($r) $t
set lbl2 [entry .labels.main_frame.val_$r -relief flat -state readonly \
        -textvariable text_val($r)]

また、text_val配列はグローバルである必要があることに注意してください(または、オプションに名前を付けるときに名前を完全に修飾する場合は、名前空間内にある必要があり-textvariableます)。これは、手順の範囲外の場所からアクセスされるためです。

もちろん、値を一定に保つ場合は、変数の使用をまったく避けて、値を手動で挿入するだけでよいことがわかります。

set lbl2 [entry .labels.main_frame.val_$r -relief flat]
$lbl2 insert 0 $t
$lbl2 configure -state readonly

値を変更しない場合は、問題なく機能します。

于 2012-06-10T12:08:20.577 に答える