2012-01-09 83 views
1

我正在学习tk并尝试调试我的脚本。我不知道我错过了什么将图像保存到文件中。感谢您的任何帮助perl,tk如何将此图像保存到文件中?

#!/tool/pandora64/bin/perl5.8.8.a 

use Tk; 

my ($size, $step) = (200, 10); 

# Create MainWindow and configure: 
my $mw = MainWindow->new; 
$mw->configure(-width=>$size, -height=>$size); 
$mw->resizable(0, 0); # not resizable in any direction 

# Create and configure the canvas: 
my $canvas = $mw->Canvas(-cursor=>"crosshair", -background=>"white", 
       -width=>$size, -height=>$size)->pack; 

# Place objects on canvas: 
$canvas->createRectangle($step, $step, $size-$step, $size-$step, -fill=>"red"); 

for(my $i=$step; $i<$size-$step; $i+=$step) { 
    my $val = 255*$i/$size; 
    my $color = sprintf("#%02x%02x%02x", $val, $val, $val); 
    $canvas->createRectangle($i, $i, $i+$step, $i+$step, -fill=>$color); 
} 

$canvas->postscript(-file=>"file_name.ps"); 

`convert file_name.ps file_name.jpeg`; # I can move this outside out of the script 

exit 0; 
+0

当你运行上面的代码时会发生什么?有没有错误信息?有意想不到的输出吗? – 2012-01-09 18:27:06

+0

它创建文件file_Name.ps和file_name.jpeg,当我查看file_name.jpeg,它什么也没有显示... – Gordon 2012-01-09 18:27:33

+0

在反引号中的转换试图产生一个新的进程,并且你不检查是否成功。 – theglauber 2012-01-09 18:28:11

回答

0

我的猜测是“转换”(在反引号)由于某种原因失败(例如不在路径中)。你需要检查是否成功。有更安全的方式在perl中产生一个子进程,例如使用“系统”调用。


基于以下戈登的评论,我想改变我的回答:

http://www.tcl.tk/man/tcl8.4/TkCmd/canvas.htm#M60

注:默认情况下后记仅提供信息生成出现在画布上的窗口在屏幕上。如果画布是新创建的,它可能仍然具有1x1像素的初始大小,因此Postscript中不会显示任何内容。要解决此问题,请调用“update”命令以等待画布窗口达到其最终大小,否则使用-width和-height选项指定要打印的画布区域。选项 - 值参数对提供了控制Postscript生成的附加信息。

+0

反正我拿出了转换,即使是ps文件显示一个空白.. – Gordon 2012-01-09 18:30:43

0

当画布生成postscript时,它会默认为屏幕的可见部分尝试这样做;此信息在生成的postscript文件中设置为边界框声明。如果您从未映射过画布(包或网格,然后处理事件一段时间),则设置为边界框的区域将为假;数据将会出现在文件中,但是当渲染到屏幕或图像时,实际上只会使用它的一小部分。

对此的修复(给定您的工作流程)是明确指定边界框。

$canvas->postscript(-file=>"file_name.ps", -width=>$size, -height=>$size); 

一旦你做到了这一点,你实际上并不需要指定有关主窗口任何东西(除了它在逻辑上存在的除外)。您也可以删除画布的光标指定;这在PS生成期间不会被使用。