in reply to A 2D layout of graphs in Perl/Tk
I'm still not 100% sure on what you're looking for, but Zentara is right about zoom and Tk::Zinc, it's capabilities far outmatch Tk::Canvas.
Unfortunately, you would have to adapt one of the Canvas charting modules for use on Zinc if you decided to use it. I'm not aware of any charting modules that use Zinc as a base.
Here is a quick and dirty example I threw together using Pane and 16 Scrolled Canvas widgets. Aside from plotting (I just threw some random blocks in), is this something like you were looking to do? It's a start if nothing else. Something I didn't do that you might want to consider is to adjust the scrollregion for the canvas as you are zooming in/out.
use strict; use Tk; use Tk::Pane; my $mw = MainWindow->new; my $sPane = $mw->Scrolled("Pane", -scrollbars => 'se', -sticky => 'nsew', -bg => 'black', -width => 300, -height => 300 )->pack(qw/-expand 1 -fill both/); my $container = $sPane->Subwidget('scrolled'); foreach my $row (0 .. 3) { foreach my $col (0 .. 3) { createTile($container, $row, $col); } } foreach my $i (0 .. 3) { $container->gridRowconfigure($i, -weight => 1); $container->gridColumnconfigure($i, -weight => 1); } MainLoop; ## Each 'Tile' is a Frame containing a Scrolled Canvas + ## another Frame containing zoom controls. sub createTile { my ($parent, $x, $y) = @_; my $tileColor = "black"; my $tile = $parent->Frame(-bg => $tileColor)->grid( -padx => 5, -pady => 5, -row => $x, -column => $y, -sticky => 'nsew' ); my $sc = $tile->Scrolled('Canvas', -scrollbars => 'osoe', -scrollregion => [0, 0, 200, 200], -width => 125, -height => 125, -background => randColor() )->pack(qw/-fill both -side top -expand 1/); my $count = int(rand(6)) + 2; foreach my $i (1 .. $count) { my ($x, $y) = (randNumber(), randNumber()); my $size = randNumber(); $sc->createRectangle($x, $y, $x+$size, $y+$size, -fill => randColor(), -outline => 'black', -width => 2 ); } my $bFrame = $tile->Frame(-bg => $tileColor)->pack(qw/-side top/); $bFrame->Button( -text => " Zoom Out ", -command => sub { $sc->scale(qw/all 0 0 .5 .5/); } )->pack(qw/-side left -padx 5/); $bFrame->Button( -text => " Zoom In", -command => sub { $sc->scale(qw/all 0 0 2 2/); } )->pack(qw/-side right -padx 5/); } sub randColor { my @colors = qw(red yellow blue orange green purple); return $colors[rand($#colors + 1)]; } sub randNumber { my ($max, $min) = (100, 10); my $size = int(rand($max)); $size += $min if $size < $min; return $size; }
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: A 2D layout of graphs in Perl/Tk
by tcarmeli (Beadle) on Oct 12, 2006 at 09:25 UTC | |
by rcseege (Pilgrim) on Oct 12, 2006 at 13:02 UTC |