我有一个显示渐变的画布小部件。这是通过从顶部到底部绘制线条来完成的,每条线条的颜色都略有不同。为此,在绘制线条的函数中,我检查了画布的高度并根据它绘制线条。问题是,第一次绘制它,或者当小部件被调整大小时(当它被调整大小时,我调用绘图函数)我从命令得到的结果winfo height $legendCanvas
是错误的并且绘图是错误的,只有当我再次调用该函数时,取值正确,绘制效果好。我试过update idletasks
在方法开始时添加,它不起作用。
相关的画布被称为legendCanvas
itcl::body siReportAttackersMatrix::setThreshold {{val ""}} {
update idletasks
# some unrelated code here
# ...
#redraw the legend
$legendCanvas delete line all
set range [expr {$maxVal*1.0-$minVal}]
set step [expr {$range/[winfo height $legendCanvas]}]
for {set y 0} {$y < [winfo height $legendCanvas]} {incr y} {
# some unrelated code that calculated the color
set id [$legendCanvas create line 0 $y [winfo width $legendCanvas] $y -fill $color]
}
set textX [expr {[winfo width $legendCanvas]/2}]
set id [$legendCanvas create text $textX 0 -anchor n -text [expr {int($maxVal * 1000)}]]
set id [$legendCanvas create text $textX [winfo height $legendCanvas] -anchor s -text [expr {int($minVal * 1000)}]]
foreach fraction [list 2 4 [expr {4/3.0}]] {
set textY [expr {int([winfo height $legendCanvas]*1.0/$fraction)}]
set textValue [expr {int(($maxVal-$minVal)*(1-1.0/$fraction)*1000)}]
set id [$legendCanvas create text $textX $textY -anchor center -text $textValue]
}
}
为了节省空间,我删除了与问题无关的代码,例如计算颜色,该方法执行的更多功能以及画布中不同项目的绑定
结果的屏幕图片:
创建时(左侧),调用方法后(右侧):
调整大小时(左侧),调用方法后(右侧):