【问题标题】:Creating a Tk Tcl entry that acts like a label创建一个像标签一样的 Tk Tcl 条目
【发布时间】:2012-06-10 22:31:24
【问题描述】:

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

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]"

但这只会创建空行:

如何为条目小部件设置默认值?

How to make the text in a Tk label selectable?的问题有关

【问题讨论】:

    标签: tcl tk


    【解决方案1】:

    这些行几乎肯定不是您想要的! (如果您使用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
    

    如果您从不更改值,那将可以正常工作。

    【讨论】:

    • insert 命令不起作用。我已经尝试过了,但它只是让条目为空。
    • @IlyaMelamed:它可能不起作用,因为您将状态设置为readonly。保持状态正常,进行插入,然后然后将状态设置为readonly
    • @BryanOakley,你是对的。 Donal 请将此添加到答案中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-11
    • 1970-01-01
    • 2013-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多