我在$gw.sw.sf.frame.c
创建了一个画布,其中$gw
是顶级窗口sw
,sf
是一个ScrollledWindow和一个来自BWidget包的ScrollableFrame,c是画布(tk::canvas
)。在画布内部只有文字和矩形填充一些颜色。
我可以使用以下方法从画布生成正确的eps文件:
$can postscript -colormode color -file test.eps
但是,如果我尝试使用::canvas::snap $can
来获取图像,然后能够使用Img包保存PNG / BMP / TIFF / JPEG图像文件,则会出现以下错误:
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)
所以问题是:
有没有办法解决这个问题,所以我可以使用:: canvas :: snap然后用Img生成图像文件?
如果没有,有没有办法只使用TclTk代码将eps文件转换为图像文件?我知道我可以为此目的使用Ghostscript或ImageMagic,但我希望我的程序只使用TclTk。
从画布中获取图像的任何其他方式??
以防万一:我使用的是OS 10.12.4 TclTk 8.6 Img 1.4.6 Tklib 0.6和BWidget 1.9.10
新事实
我发现问题出在OS X版本上。在我的工作中,我使用的是10.10.4,这里代码能够创建图形,但在创建图形之后,画布内容变为白色。我猜canvas :: snap会改变窗口内的堆叠顺序,从而产生明显的空白画布,这是正确的吗?
此外,我接受了Donal Fellows的建议并直接在.toplevelwindow.canvas中创建画布,并使用10.10.4 canvas :: snap和Img生成正确的图像,窗口内容不会改变。使用10.12.4我得到了和以前一样的错误。有什么工作吗?
答案 0 :(得分: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套件中,因为它可以完成这些转换而无需访问用户的屏幕。