根据条件检查更改帧颜色

时间:2016-06-23 10:02:53

标签: tcl tk

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

但是当我尝试打包忘记重绘帧时,在连续循环中它表示小部件已经存在。由于不支持,我无法对帧颜色使用configure命令。 请提出解决方案。

#!/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 $11}}]
    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}

1 个答案:

答案 0 :(得分:1)

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

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不会从其父级请求任何窗口区域,因此其背景将不可见。

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

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

这应该是蓝色正方形。

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

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,您可以在图标之间切换,而不是更改背景颜色。

文档:afterevalexprframeifinfolabel,{{3 }},packprocputs