【问题标题】:Automatic display of TCL sub field in TK label自动显示TK标签中的TCL子字段
【发布时间】:2020-01-24 17:08:31
【问题描述】:

我有一个变量和一个显示变量内容的标签。每次变量有新值时它都会改变:

global MyVariable
label .mylabel -textvariable MyVariable

这行得通。

现在的问题是MyVariable 不包含我想要显示的值,但它是一个值列表,我想执行一些代码来提取实际包含要显示的数据的子字段。有没有一种简单的方法可以将一些粘合逻辑放入该标签中,以便在更改的变量内容显示之前对其进行预处理?

【问题讨论】:

    标签: tcl tk


    【解决方案1】:

    标签只能观察整个变量,无论是标量还是(关联)数组的元素。他们没有任何东西可以查看列表或字典或其他结构。但是你可以用trace来模拟你想要的。

    trace add variable x write [list apply {args {
        global x x_1
        set x_1 [lindex $x 1]
    }}]
    set x [list a b c d e]
    label .x1 -textvariable x_1
    pack .x1
    
    # Some time later...
    lset x 1 fruitbat
    
    # A different type of update
    set x "the quick brown fox"
    

    您可以将任意复杂的计算放入跟踪中,但在实践中使它们相当快以使您的 GUI 感觉响应是一个非常好的主意。尽管(在某些情况下)从文件或数据库中读取实际上可能已经足够快了,所以不要觉得太受限制……

    【讨论】:

      【解决方案2】:

      好的,现在我了解了 Donals 的答案以及我在使用它时遇到的问题,我想分享我的解决方案

          upvar $tmVar tracedVariable
          trace variable tracedVariable w {apply {{nameOfTraceVar v2 op} {
              upvar $nameOfTraceVar localAccess
              .mode.tl_$nameOfTraceVar configure -text [getengvalue $localAccess]
          }}}
      
          label  ".mode.tl_$tmVar" -text "-"
      

      所有这些都是为名为@9​​87654322@ 的变量创建标签并被多次调用的过程的一部分。 lambda 现在直接将派生值写入标签。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-12
        • 1970-01-01
        • 2021-08-01
        相关资源
        最近更新 更多