创建一个像标签一样的Tk Tcl条目

时间:2012-06-10 11:33:08

标签: tcl tk

我想创建标签,可以选择其中的文字进行复制/粘贴。为此,我尝试使用只读条目。但我似乎无法初始化它们中的文本值。标签在循环内生成,标签数量及其内容未知。生成标签的代码是:

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}
}

它创建了一个休息窗口:

enter image description here

然后我尝试用以下行替换行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]"

但这只会创建空行:

enter image description here

如何将默认值放入条目窗口小部件?

与问题How to make the text in a Tk label selectable?

相关

1 个答案:

答案 0 :(得分: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

如果你永远不改变价值,那就可以了。