Your skill will accomplishwhat the force of many cannot PerlMonks

### TK Canvas: Group vs. tags

 on Mar 26, 2004 at 16:56 UTC Need Help??

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

I've been doing a little TK work lately, and I was looking through my Emu book. I noticed that there is a new canvas item called Group, that collects other items and allows you to act on them as a unit.
Traditionally, I would just tag all the items with a unique tag and use it to act on the items.
So my question is: Is the Group type just syntactic sugar? Or are there performance and/or memory benefits to using groups?

-pete
"Ted Nugent called. He wants his shirt back."

Replies are listed 'Best First'.
Re: TK Canvas: Group vs. tags
by zentara (Archbishop) on Mar 26, 2004 at 18:54 UTC
As an example of the usefulness of using groups in motion operations, show me how you would do this with just 'tags'.
```#!/usr/bin/perl
use warnings;
use strict;
use Tk;

my \$mw = MainWindow->new();

# first create a canvas widget
my \$canvas = \$mw->Canvas(width => 300, height => 200)->pack();
my \$one = \$canvas->createOval(5,  0, 20, 30, -fill => 'blue');
my \$two = \$canvas->createRectangle(0, 20, 50, 75, -fill => 'red');

my \$group = \$canvas->createGroup([0, 0], -members => [\$one, \$two]);

my \$dx = 1;
my \$dy = 1;
my \$id = Tk::After->new(\$canvas,10,'repeat',
sub {\$canvas->move(\$group, \$dx,\$dy);
my (\$x,\$y) = \$canvas->bbox(\$group);
print "\$x \$y\n";
if(\$y >= 100){\$dy = -1};
if(\$x >= 200){\$dy = 1; \$dx = -1};
if(\$x < -5){\$dx=1;\$dy=1};
});

my \$ebutton = \$mw->Button(-text => 'Exit',
-command => 'Tk::exit')->pack();

my \$sbutton = \$mw->Button(-text => 'Stop',
-command => sub{\$id->cancel;})->pack();

MainLoop();

I'm not really a human, but I play one on earth. flash japh
Like this:
```#!/usr/bin/perl
use warnings;
use strict;
use Tk;

my \$mw = MainWindow->new();

# first create a canvas widget
my \$canvas = \$mw->Canvas(width => 300, height => 200)->pack();
my \$one = \$canvas->createOval(5,  0, 20, 30, -fill => 'blue',-tags =>
+['fred']);
my \$two = \$canvas->createRectangle(0, 20, 50, 75, -fill => 'red',-tags
+ => ['fred']);

#my \$group = \$canvas->createGroup([0, 0], -members => [\$one, \$two]);
my \$group='fred';
my \$dx = 1;
my \$dy = 1;
my \$id = Tk::After->new(\$canvas,10,'repeat',
sub {\$canvas->move(\$group, \$dx,\$dy);
my (\$x,\$y) = \$canvas->bbox(\$group);
print "\$x \$y\n";
if(\$y >= 100){\$dy = -1};
if(\$x >= 200){\$dy = 1; \$dx = -1};
if(\$x < -5){\$dx=1;\$dy=1};
});

my \$ebutton = \$mw->Button(-text => 'Exit',
-command => 'Tk::exit')->pack();

my \$sbutton = \$mw->Button(-text => 'Stop',
-command => sub{\$id->cancel;})->pack();

MainLoop();
Update: Actually I can see the usefulness for rotation. But for motion, and state-changes and such the two methods appear the same.

-pete
"Worry is like a rocking chair. It gives you something to do, but it doesn't get you anywhere."
Well, I'm out of XP today, but I would give you one for that. :-)

I'm not really a human, but I play one on earth. flash japh
Re: TK Canvas: Group vs. tags
by zentara (Archbishop) on Mar 26, 2004 at 18:25 UTC
I'm not sure about the standard Tk Canvas 'group', but in Tk::Zinc( an enhanced canvas ) , groups are very important in doing things like rotations and motion. Maybe this would be a good question for comp.lang.perl.tk where those experts can explain the c code behind it all.

For instance, if you tried to rotate a bunch of "tags", they would all rotate independently; but if they are grouped, you can specify the group center point, where they would rotate around.

I'm not really a human, but I play one on earth. flash japh

Create A New User
Node Status?
node history
Node Type: perlquestion [id://340074]
Approved by flyingmoose
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others rifling through the Monastery: (4)
As of 2021-05-09 14:31 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
Perl 7 will be out ...

Results (100 votes). Check out past polls.

Notices?