调整大小后,Canvas小部件的大小错误

时间:2013-10-21 07:44:00

标签: tcl tk

我有一个显示渐变的画布小部件。这是通过从顶部到底部绘制线条来完成的,每条线条的颜色略有不同。为了实现这一点,在绘制线的函数中,我检查画布的高度并根据它绘制线条。问题是,第一次绘制它时,或者当窗口小部件被调整大小时(当它被调整大小时,我调用绘图函数)我从命令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]
    }
}

为了节省空间我已经删除了对问题感兴趣的代码,比如计算颜色,该方法执行的更多功能以及对画布中不同项目的绑定

结果的屏幕图片:

创建时(左侧),调用方法后(右侧):

enter image description here

在调整大小时(左侧),调用方法后(右侧):

enter image description here

1 个答案:

答案 0 :(得分:3)

解决此问题的最简单方法是在画布窗口小部件收到<Configure>事件时重新计算渐变。特别是,%h事件中的%w<Configure>替换告诉您窗口小部件的大小设置为什么,尽管基本的Tk基础结构也会将这些值保存到窗口小部件中记录(winfo heightwinfo width可以检索它们。)

# Something like this; you might want to tweak the binding
bind $legendCanvas <Configure> { doRescale %W %w %h }

建议您使用 处理此过程的程序(或方法);其他需要重新缩放的操作(例如初始设置代码)可以根据需要调用它。