2013-10-21 71 views
1

我有一个显示渐变的画布小部件。这是通过从上到下绘制线条来完成的,每条线条的颜色略有不同。为了实现这一点,在画线的函数中,我检查画布的高度并根据它绘制线条。问题是,第一次绘制它时,或者当窗口小部件被调整大小时(当它调整大小时,我调用绘图函数),我从命令winfo height $legendCanvas得到的结果是错误的,并且绘图不好,只有当我回想起函数再次,它得到正确的价值和绘图结果是好的。我已经尝试在方法开始时添加update idletasks,但它不起作用。调整大小后Canvas小部件的大小有误

相关的帆布被称为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] 
    } 
} 

为了节省我已经删除代码,irellevent的问题,如计算的色彩,多了一些功能,该方法确实和绑定空间在画布上的不同项目的结果

屏幕图片:

在创作(上左),回顾法(右侧)后:

enter image description here

在调整大小(在左侧),忆方法(右侧)之后:

enter image description here

+0

'更新idletasks'有时不会做你想做的。我在这里有一个循环,为每次迭代在画布图像对象上放置一个像素;并希望看到每个像素即时绘制。使用'update idletasks',我得到了循环运行时显示的主窗口,但没有显示像素;相反,我得到了一个等待光标。然后 http://computer-programming-forum.com/57-tcl/fcbc7386c797bbdc.htm给了我解决方案:'更新'。 (没有* idletasks *) – sergiol

回答

3

定影这个的最简单的方法是重新计算梯度每当画布小部件收到<Configure>事件。特别是,<Configure>事件中的%h%w替换会告诉您设置小部件的大小,但基本Tk基础架构还会将这些值保存到小部件记录(其中winfo heightwinfo width可以检索它们)。

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

我们建议你有一个程序(或方法)只是处理这一点;其他需要重新缩放的操作(例如初始设置代码)可以根据需要调用它。

相关问题