my %rects; my %ovals; for my $num(1..10){ $rects{$num}{'object'} = $canvas->createRect( ...... -tags => [$num , 'rect' ] ); $rects{$num}{'num'} = $num; $rects{$num}{'mydata2'} = "some array or HoA" $rects{$num}{'object'}->bind('Enter',sub{ print "$num\n" }); } for my $num(1..10){ $ovals{$num}{'object'} = $canvas->createOval( ...... -tags => [$num , 'oval' ] ); $ovals{$num}{'num'} = $num; $ovals{$num}{'mydata2'} = "some array or HoA" } #### my $data = $ovals{$num_from_tags}{'mydata2'} #### #!/usr/bin/perl ############################################################ # Example of animation on the gnome canvas. # # Dov Grobgeld ############################################################ use Gtk2 '-init'; use Gnome2::Canvas; use strict; my ( $w_top, $w_canvas ); my $min_x = 5; my $max_x = 500; my ( $rect_green, $rect_orange ); ############################################################ # Create the widgets ############################################################ sub create_widgets { $w_top = Gtk2::Window->new; $w_top->signal_connect( destroy => sub { exit } ); my $vbox = Gtk2::VBox->new( 0, 0 ); $w_top->add($vbox); $w_canvas = Gnome2::Canvas->new_aa(); $vbox->pack_start( $w_canvas, 1, 1, 0 ); $w_canvas->set_size_request( 600, 300 ); $w_canvas->set_scroll_region( 0, 0, 600, 300 ); my $quit = Gtk2::Button->new("Quit"); $quit->signal_connect( clicked => sub { exit } ); $vbox->pack_start( $quit, 0, 0, 0 ); $w_top->show_all(); } sub place_objects_on_canvas { my $root = $w_canvas->root(); $rect_green = Gnome2::Canvas::Item->new( $root, "Gnome2::Canvas::Rect", x1 => 240, y1 => 90, x2 => 440, y2 => 180, fill_color_rgba => 0x3cb37180, outline_color => "black", width_units => 2.0 ); # Add user data $rect_green->{dir} = 1; $rect_green->{speed} = 5; $rect_orange = Gnome2::Canvas::Item->new( $root, "Gnome2::Canvas::Ellipse", x1 => 30, y1 => 150, x2 => 250, y2 => 240, fill_color_rgba => 0xb3713c80, outline_color => "black", width_units => 2.0 ); $rect_orange->{dir} = -1; $rect_orange->{speed} = 8; Glib::Timeout->add( 10, \&cb_animation_step ); } ############################################################ # Takes one step of the animation. rect_green is moved by # DELTA_Y_GREEN and rect_orange by DELTA_Y_ORANGE. When they # meet the borders, their direction change ############################################################ sub cb_animation_step { foreach my $r ( $rect_green, $rect_orange ) { # Get old values my ( $old_x1, $old_x2 ) = $r->get( "x1", "x2" ); # Get user data my $dir = $r->{dir} || 1; my $speed = $r->{speed}; # Move the object my $new_x1 = $old_x1 + $dir * $speed; my $new_x2 = $old_x2 + $dir * $speed; # Check if we hit a wall if ( $new_x1 < $min_x || $new_x2 > $max_x ) { $dir = -$dir; $r->{dir} = $dir; $new_x1 = $old_x1 + $dir * $speed; $new_x2 = $old_x2 + $dir * $speed; } # Update new parameter data $r->set( x1 => $new_x1, x2 => $new_x2 ); } # As long as this routine returns TRUE, it will be # called again return 1; } create_widgets(); place_objects_on_canvas(); Gtk2->main();