1

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

为了节省空间,我删除了与问题无关的代码,例如计算颜色,该方法执行的更多功能以及画布中不同项目的绑定

结果的屏幕图片:

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

在此处输入图像描述

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

在此处输入图像描述

4

1 回答 1

3

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

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

建议您有一个程序(或方法)来处理这个问题其他需要重新缩放的操作(例如初始设置代码)可以根据需要调用它。

于 2013-10-21T08:39:10.860 回答