2017-05-07 108 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