For Programmers: Free Programming Magazines  


Home > Archive > PerlTk > November 2004 > composite canvas widgets









You are viewing an archived Text-only version of the thread. To view this thread in it's original format and/or if you want to reply to this thread please [click here]

 

Author composite canvas widgets
Arnold Wiegert

2004-11-05, 8:56 pm

Hi,
As part of a graphical editor, I would like to be able to use composite
widgets on a canvas - i.e. a symbol consisting of circles, polygons,
lines etc.

I think I would be able to generate the necessary widgets with minimal
trouble, but what has me stumped is a way to move these composite
widgets as a unit.

Some widgets will need to be filled, so a polygon or multi-segment line
approximation is not really an (easy) option.

Is Tk_CreateItemType the only way to go?

Are there any workable examples of Tk_CreateItemType (for Perl/Tk?) ?

Any comments or ideas would be most welcome.


Arnold
Ala Qumsieh

2004-11-05, 8:56 pm

Arnold Wiegert wrote:

> I think I would be able to generate the necessary widgets with minimal
> trouble, but what has me stumped is a way to move these composite
> widgets as a unit.


Just tag all related items with the same string, and use this tag in
your move() call.

> Some widgets will need to be filled, so a polygon or multi-segment line
> approximation is not really an (easy) option.


I don't understand. You can fill a polygon.

> Is Tk_CreateItemType the only way to go?


This function is not accessible though the regular Tk API. It's mainly
used (AFAIK) internally in the Canvas's C code.

What exactly are you trying to do? Can you show us an example of what
your "widget" is supposed to look like?

--Ala
Jack D

2004-11-05, 8:56 pm


"Arnold Wiegert" <awiegert-remove-this-@telus.net> wrote in message
news:53Sid.54872$VA5.16567@clgrps13...
> Hi,
> As part of a graphical editor, I would like to be able to use composite
> widgets on a canvas - i.e. a symbol consisting of circles, polygons,
> lines etc.


To clarify - we call these "canvas items" - not composite widgets. Composite
widgets are another beast altogether.

>
> I think I would be able to generate the necessary widgets with minimal
> trouble, but what has me stumped is a way to move these composite
> widgets as a unit.


Use Ala's suggestion of tagging them [i.e. items - not widgets :-) ]all with
the same tag. Or you can use the undocumented "group" functionality. See
this older post:

http://groups.google.ca/groups?selm=v8_18.163$t64.97843@newsfeed.slurp.net

>
> Some widgets will need to be filled, so a polygon or multi-segment line
> approximation is not really an (easy) option.
>
> Is Tk_CreateItemType the only way to go?


Only if you have a specific item that cannot be shown/drawn using the
existing items (i.e. polygons, lines, text etc).

>
> Are there any workable examples of Tk_CreateItemType (for Perl/Tk?) ?


None that I know of. That would be way beyond my knowledge-base and
certainly not something "I" would consider doing.

Also - check out Tk::Zinc. It has additional item types over and above the
basic canvas which might prove helpful to achieving whatever goal you have
in mind.

Jack


zentara

2004-11-06, 8:56 am

On Fri, 05 Nov 2004 21:14:41 GMT, Arnold Wiegert
<awiegert-remove-this-@telus.net> wrote:

>Hi,
>As part of a graphical editor, I would like to be able to use composite
>widgets on a canvas - i.e. a symbol consisting of circles, polygons,
>lines etc.
>
>I think I would be able to generate the necessary widgets with minimal
>trouble, but what has me stumped is a way to move these composite
>widgets as a unit.
>
>Some widgets will need to be filled, so a polygon or multi-segment line
>approximation is not really an (easy) option.
>
>Is Tk_CreateItemType the only way to go?
>
>Are there any workable examples of Tk_CreateItemType (for Perl/Tk?) ?
>
>Any comments or ideas would be most welcome.


Use the group feature of canvas.
Of course you could do it all manually with tags, but groups
are easier IMO.

#!/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();
__END__











--
I'm not really a human, but I play one on earth.
http://zentara.net/japh.html
Arnold Wiegert

2004-11-06, 3:55 pm

Thank you all for your help.

It looks like the 'group' functionality will do the trick for me.

I had looked at Zinc, but the lack of PS output was a factor in not even
trying it.

Ala Qumsieh wrote:
> Arnold Wiegert wrote:
>
>
>
> Just tag all related items with the same string, and use this tag in
> your move() call.

I didn't read that possibility into the docs I have. But I guess the
'group' feature will really do the trick for me
>
>
>
> I don't understand. You can fill a polygon.

My fuzzy thinking - see below :-)
>
>
>
> This function is not accessible though the regular Tk API. It's mainly
> used (AFAIK) internally in the Canvas's C code.
>
> What exactly are you trying to do? Can you show us an example of what
> your "widget" is supposed to look like?
>

some symbols are squares with additional lines at various angles, others
are circles with radial lines. I suppose polygons could have non-closed
'tails' - but I didn't like that idea too much.

Again, thanks.

Arnold
Slaven Rezic

2004-11-06, 8:56 pm

Arnold Wiegert <awiegert-remove-this-@telus.net> writes:

> Hi,
> As part of a graphical editor, I would like to be able to use
> composite widgets on a canvas - i.e. a symbol consisting of circles,
> polygons, lines etc.
>
> I think I would be able to generate the necessary widgets with minimal
> trouble, but what has me stumped is a way to move these composite
> widgets as a unit.
>
> Some widgets will need to be filled, so a polygon or multi-segment
> line approximation is not really an (easy) option.
>
> Is Tk_CreateItemType the only way to go?
>
> Are there any workable examples of Tk_CreateItemType (for Perl/Tk?) ?
>


See the Tk::Canvas::Point module at CPAN for an example how to add a
new canvas type to the Perl/Tk canvas. However, the ability to add
mega or composite or completely new canvas items in pure perl would be
neat. A lot of grouping problems can be solved with clever tag
definitions or the "group" canvas item, but some problems remain
complex (for example scaling --- see the "scale_width" function in my
"bbbike" application).

Regards,
Slaven

--
Slaven Rezic - slaven <at> rezic <dot> de

tktimex - project time manager
http://sourceforge.net/projects/ptktools/
zentara

2004-11-07, 8:56 am

On Sat, 06 Nov 2004 17:52:40 GMT, Arnold Wiegert
<awiegert-remove-this-@telus.net> wrote:

>Thank you all for your help.
>
>It looks like the 'group' functionality will do the trick for me.
>
>I had looked at Zinc, but the lack of PS output was a factor in not even
>trying it.


The Zinc authors are working on PS output, in the mean time you can use
WinPhoto to capture Zinc, if on linux.

Zinc is really the way to go when you want to use groups. You can
rotate, scale-zoom, and clip groups in Zinc. Very powerful, and not
much harder than Canvas.

Just my opinion. :-)

--
I'm not really a human, but I play one on earth.
http://zentara.net/japh.html
Arnold Wiegert

2004-11-08, 3:58 am

zentara wrote:

> On Sat, 06 Nov 2004 17:52:40 GMT, Arnold Wiegert
> <awiegert-remove-this-@telus.net> wrote:
>
>
>
>
> The Zinc authors are working on PS output, in the mean time you can use
> WinPhoto to capture Zinc, if on linux.
>

That is good to hear, I'll try to keep it in mind
Also, I do want to keep it workable on both Winxx and *nix since this is
supposed to be a replacement for an older (incomplete) X-windows program
that would/could see more use if usable/available on a Winxx platform.

> Zinc is really the way to go when you want to use groups. You can
> rotate, scale-zoom, and clip groups in Zinc. Very powerful, and not
> much harder than Canvas.
>
> Just my opinion. :-)
>

Unless I run into some very serious problems, I think I'm too far gone
down the 'canvas' road to change now - or perhaps too lazy/scared to
start over and hope for the PS output to show up ;-)

Still, it is good to know it is an alternative.

Arnold
Sponsored Links







Also available: Server administration forum archive | Web Design forum archive | Software forum archive | Hardware reviews archive

Copyright 2008 codecomments.com