根据条件检查更改框架颜色

Changing frame colour based on a condition check

我正在编写一个 tcl 脚本来根据许可证可用性更改框架颜色。如果许可证可用,它将显示蓝色,否则显示红色。这会定期运行(并且框架颜色将根据可用性更改)使用 tcl 每个 proc。

但是当我尝试打包时忘记重新绘制框架,在连续循环中它说小部件已经存在。我无法使用框架颜色的配置命令,因为它不受支持。 请提出解决方案。

#!/tools/tcl/tcl8.6/bin/tclsh -f

package require Tk

proc checkLic {} {
    set val [exec lmstat -a -c /tools/license/dat/cadence_orbit_3x.dat -f Liberate_MX_Client | grep issued | awk {{print }}]
    puts $val
    if {$val == 0} {
        after 1000
        pack forget .high
        after 1000
        frame  .high -width 8 -height 30 -background blue
        pack .high -side right
    } else {
        after 1000
        pack forget .high
        after 1000
        frame .high -width 8 -height 30 -background red
        pack .high -side right
    }
}

proc every {ms body} {
    eval $body
    after $ms [info level 0]
}

every 1000 {checkLic}

看来我的回答没有想清楚,抱歉。我专注于显示背景的方法,而没有注意到您已经涵盖了这些内容。此代码显示了如何在没有您提到的更新问题的情况下获得振荡显示。基本上,代码创建一次框架,然后只更改颜色,而不是取消管理并尝试重新创建它。

set gval 0

frame  .high -width 8 -height 30 -background blue
pack .high -side right

proc checkLic {} {
    # replace this with your own lookup code
    set val [set ::gval [expr {!$::gval}]]

    puts $val
    if {$val == 0} {
        .high configure -background blue
    } else {
        .high configure -background red
    }
}

proc every {ms body} {
    eval $body
    after $ms [info level 0]
}

every 1000 {checkLic}

旧答案:

基本 frame 不向其父级请求任何 window 区域,因此其背景将不可见。

要使背景可见,您可以明确设置高度和宽度:

frame .high -height 20 -width 20 -background blue
pack .high

这应该是可见的蓝色方块。

另一种请求框架 window 区域的方法是为其提供内容,但背景仍然不可见,除非您指定边框宽度:

frame .high -borderwidth 10 -background blue
pack .high
label .high.txt -text foobar
pack .high.txt

无论哪种情况,您都可以像这样更改背景颜色:

.high configure -background red

可能您最好使用 label 而不是 frame:

label .high -width 5 -background blue
pack .high
.high configure -background red

使用 label 您可以在图标之间切换而不是更改背景颜色。

文档:after, eval, expr, frame, if, info, label, pack, proc, puts, set