2013-10-21 120 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 } 

我們建議你有一個程序(或方法)只是處理這一點;其他需要重新縮放的操作(例如初始設置代碼)可以根據需要調用它。

相關問題