Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

My questions is about perl-tk canvas. I have a image that i parse and display in a canvas and want to send to a printer. ive tried using the postscript module, but have had no luck with it. i also cannot find any documentation on printing from a canvas. am i making this too hard and their is a easier way? anyways any help or direction for me to look would be appreciated.

Replies are listed 'Best First'.
Re: Printing a image from a canvas
by liverpole (Monsignor) on Nov 06, 2006 at 01:23 UTC
    I've always just used the postscript method of a Canvas object to save to a postscript file, and then printed from the file, using ghostview, or something else which renders and prints postscript.

    That is to say, I do something like this:

    # Where $can is a Canvas object, # and $psfile is the file to write to ... $can->postscript(-file => $psfile);

    I haven't looked at the postscript module personally, but if it allows you to print from a file, then you could use my snippet above, followed by whatever lets you send it to your printer.


    s''(q.S:$/9=(T1';s;(..)(..);$..=substr+crypt($1,$2),2,3;eg;print$..$/
Re: Printing a image from a canvas
by Khen1950fx (Canon) on Nov 06, 2006 at 02:58 UTC
Re: Printing a image from a canvas
by zentara (Cardinal) on Nov 06, 2006 at 12:55 UTC
    I don't know what the "postscript module" is, and I find it hard to believe that a groups.google.com search didn't return anything for "perl tk canvas save" . Try it. You have 2 choices. The first is the postscript method, which has the useful trick of getting a whole scrolled canvas
    #!/usr/bin/perl use Tk; #to change the background color, edit the ps file # 0.000 0.000 0.000 setrgbcolor AdjustColor # fill $width = 800; $height = 500; my $main = MainWindow->new(); my $canvas = $main->Canvas( -width=>$width, -height=>$height, -backgro +und=>"black"); $canvas->pack( -expand=>1,-fill=>'both'); &create; $canvas->update; $main->update; $main->Button( -text => "Save", -command => [sub { $canvas->update; my @capture=(); my ($x0,$y0,$x1,$y1)=$canvas->bbox('all'); @capture=('-x'=>$x0,'-y'=>$y0,-height=>$y1-$y0,-width=>$x1-$x +0); $canvas -> postscript(-colormode=>'color', -file=>$0.'.ps', -rotate=>0, -width=>800, -height=>500, @capture); } ] )->pack; MainLoop; sub create{ $canvas->createOval(100, 100, 600, 600,-fill=>'green') }
    The second method, is Tk::WinPhoto, which is only available on linux, and captures only the visible canvas region to a gif, jpg, or png file. See the groups.google.com search above.

    To actually print, you need to send it to the printer yourself

    # on linux, and you might want to fork it off so it # dosn't block your program system("lpr -P lp0 mypsfile.ps"); # lp1, lp2, etc

    I'm not really a human, but I play one on earth. Cogito ergo sum a bum