2017-05-07 105 views
1

我已經創建畫布獲得圖像中$gw.sw.sf.frame.c其中$gw是一個頂層窗口swsf是ScrolledWindow並從BWidget封裝的ScrollableFrame和c是畫布(tk::canvas)。在畫布內部,只有填充了某種顏色的文本和矩形。然而TclTk從帆布

$can postscript -colormode color -file test.eps 

,如果我試圖用::canvas::snap $can爲了得到一個圖像,然後可以使用保存PNG/BMP/TIFF/JPEG圖像文件: 我可以使用產生從畫布正確的EPS文件該圖包我得到以下錯誤:

Window ".graphresults1494146100.sw.sf.frame.c" cannot be transformed into a pixmap (possibly obscured?) 
Window ".graphresults1494146100.sw.sf.frame.c" cannot be transformed into a pixmap (possibly obscured?) 
    while executing 
    "image create photo -data $can" 
     (procedure "::mTKs::savegraphres" line 3) 
     invoked from within 
    "::mTKs::savegraphres .graphresults1494146100.sw.sf.frame.c" 
     (menu invoke) 

所以問題是:

  1. 有沒有辦法解決這個問題,所以我可以用::帆布::卡的d然後Img生成圖像文件?

  2. 如果沒有,有沒有什麼辦法EPS文件轉換爲只使用TclTk碼的圖像文件?我知道我可以使用的Ghostscript或ImageMagic用於此目的,但我想我的程序只使用TclTk。

  3. 任何其他方式來獲得從畫布圖像?

以防萬一:我使用的OS 10.12.4 TclTk 8.6圖1.4.6 Tklib 0.6和BWidget 1.9.10

新的事實

我發現,問題出在操作系統X版本。在我的工作,我使用10.10.4這裏的代碼是能夠創建數字,但在創建人物後,在畫布上的內容變爲全白。我想,帆布::捕捉改變,導致一個明顯的空白畫布窗口內的堆疊順序,這是正確的?

此外,我接受了Donal Fellows的建議,並直接在.toplevelwindow.canvas中創建畫布,並使用10.10.4 canvas :: snap和Img生成正確的圖像,並且窗口內容未被更改。使用10.12.4我得到了和以前一樣的錯誤。任何解決這個問題?

回答

0

您正在使用作爲Img包的一部分支持的機制(有時也稱爲tkimg來區分它)。該錯誤消息是:

Window ".graphresults1494146100.sw.sf.frame.c" cannot be transformed into a pixmap (possibly obscured?)

的問題是,一畫布的一個圖像轉換爲通過執行畫布的屏幕抓鬥執行(即,它是完全相同的底層API,任何屏幕截圖機構使用),似乎失敗了。失敗的最可能原因是畫面在捕捉完成時未顯示在屏幕上;它需要屏幕上最上面的才能工作。

要使畫布在屏幕上顯示,需要由自身映射的頂層內的幾何管理器進行適當管理。然後需要將它提升到堆棧窗口的頂部,無論是在頂層還是頂層都相對於屏幕其餘部分的內容。通常你可以做到這一點:

pack $thecanvas; # Or 「grid $thecanvas」 or any of a number of other alternatives 
update 
raise $thecanvas 
raise -force [winfo toplevel $thecanvas] 
update 
# Do the capture here 

然而,在你的情況下,它是小部件的複雜堆棧裏面所以那些可能是一個問題。 (例如,他們可能會迫使畫布被映射到屏幕外或類似的東西,各種各樣的複雜性是可能的!)如果是這樣的話,在另一個畫布上生成內容(只需要暫時)可能是一種解決方法。我不知道該畫布是否需要在屏幕上可見,但我懷疑它確實如此。


一般來說,如果你真的做了很多這樣的轉換,這可能是更好的封裝PostScript轉換爲圖像,而不是直接通過屏幕捕獲(因爲這是總是有點片狀和不確定)。通常用於做這件事的工具是Ghostscript,經常將它封裝在ImageMagick套件中,因爲它可以完成這些轉換,而無需訪問用戶的屏幕。

+0

當我試圖生成圖像時,畫布顯示在頂部,原則上:: canvas :: snap負責將畫布上升到頂部。所以最可能的問題就是您提到我正在使用的複雜堆疊的小部件。我會嘗試一個簡單的畫布。從你的答案我應該明白,沒有本地的TclTk包來從eps轉換爲任何其他圖像格式? – kbr85