我正在编写一个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}
答案 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
,您可以在图标之间切换,而不是更改背景颜色。
文档:after,eval,expr,frame,if,info,label,{{3 }},pack,proc,puts