I tried your script and got the same errors.  It piqued my interest
because the error seem to occur even when all calls to update meter are
removed.  If I put a die in the update_meter routine, it was never
reached and yet commenting out the $needle->set and $text->set made the
errors go away.  Very odd.

I was testing on Debian Sarge and a colleague tested on Debian unstable.
He did not get the errors.  I'm assuming that the libraries are
different versions.

Anyway, I was able to make the errors go away by making these 3 changes:

-$window->signal_connect( 'destroy' => \&delete_event );
+$window->signal_connect( 'delete-event' => \&delete_event );

...

 sub delete_event {
     $watch->Unwatch;
-    $canvas->destroy;
     Gtk2->main_quit;
-    return 0;
+    return 1;
}


Was there any particular need to destroy the canvas object rather than
leaving it to be cleaned up?

I've attached a tweaked version of the script that uses a Bezier curve
to create a half circle rather than using an ellipse object.

Cheers
Grant

On Mon, 2005-07-11 at 12:58 -0400, zentara wrote:
> Hi,
> I'm trying to make a simple gauge with the Gnome2::Canvas.
> It all works well, except when I destroy the meter.  I get an error
> 
> nomeCanvas-CRITICAL **: file gnome-canvas.c: line 3698 
> (gnome_canvas_request_redraw): assertion `GNOME_IS_CANVAS (canvas)' failed 
> during global destruction.
> 
> I have found through trial and error, that I get this repeated twice, but 
> have found
> that I can reduce it to 1 by putting a "$canvas->destroy;"  in my 
> delete_event subroutine.
> Additionally, I can stop the error by NOT updating the  $text->set(text => 
> $value); 
> in the update_meter sub.
> 
> So that is my main question, how do I stop this annoying error message, when 
> I update
> the Canvas Text widget?
> 
> As a bonus question :-),  how do I prevent the $gauge circle from being seen
> at the bottom, when you drag the main window to a bigger size? I only want
> an "ARC" , but Ellipse dosn't seem to have limit points available to set.  I 
> tried to
> limit the size of the $canvas, but the circle will still show. Am I forced to 
> mask it with
> something?
> 
> Thanks.
> #Simple Meter
> ################################################################
> #!/usr/bin/perl
> use warnings;
> use strict;
> use Glib qw/TRUE FALSE/;
> use Gtk2 '-init';
> use Gnome2::Canvas;
> use constant PI => 3.1415926;
> use Tie::Watch;
> 
> my $width  = 200;
> my $height = 100;
> my $value  = 0;
> my $max = 100;
> my $min = 0; 
> 
> my $watch = Tie::Watch->new(
>     -variable => \$value,
>     -shadow   => 0,
>     -store    => \&update_meter,
> );
> 
> my $window = Gtk2::Window->new;
> $window->signal_connect( 'destroy' => \&delete_event );
> $window->set_default_size( $width, $height );
> 
> my $canvas = Gnome2::Canvas->new_aa();
> $canvas->set_scroll_region( 0, 0, $width, $height );   #to get upper left 
> corner
> $canvas->set_size_request( $width, $height );   #useless?
> $window->add($canvas);
> $window->show_all;
> 
> my $root = $canvas->root();
> 
> my $text = Gnome2::Canvas::Item->new(
>     $root, 'Gnome2::Canvas::Text',
>     x          => $width / 2,
>     y          => $height * .50,
>     fill_color => 'yellow',
>     font       => 'Sans 14',
>     anchor     => 'GTK_ANCHOR_CENTER',
>     text       => $value
> );
> 
> my $box = Gnome2::Canvas::Item->new(
>     $root, 'Gnome2::Canvas::Rect',
>     x1            => 0,
>     y1            => 0,
>     x2            => $width,
>     y2            => $height,
>     fill_color    => 'black',
>     outline_color => 'black'
> );
> 
> my $hub = Gnome2::Canvas::Item->new(
>     $root, "Gnome2::Canvas::Ellipse",
>     x1            => $width / 2 - 8,
>     y1            => ( $height * .80 ) - 8,
>     x2            => $width / 2 + 8,
>     y2            => ( $height * .80 ) + 8,
>     fill_color    => 'white',
>     outline_color => 'black'
> );
> 
> my $gauge = Gnome2::Canvas::Item->new(
>     $root, "Gnome2::Canvas::Ellipse",
>     x1            => $width / 2 - 80,
>     y1            => ( $height * .80 ) - 80,
>     x2            => $width / 2 + 80,
>     y2            => ( $height * .80 ) + 80,
>     outline_color => 'white',
>     fill_color    => 'steelblue'
> );
> 
> my $floor = Gnome2::Canvas::Item->new(
>     $root, 'Gnome2::Canvas::Rect',
>     x1            => 0,
>     y1            => $height * .80,
>     x2            => $width,
>     y2            => $height,
>     fill_color    => 'black',
> );
> 
> my $needle = Gnome2::Canvas::Item->new(
>     $root, "Gnome2::Canvas::Line",
>     points => [ $width / 2, ( $height * .80 ), $width / 2, 10 ],
>     width_units    => 5,
>     fill_color     => 'hotpink',
>     last_arrowhead => 1,
>     arrow_shape_b  => 20
> );
> 
> $box->lower_to_bottom;
> $needle->raise_to_top;
> $hub->raise_to_top;
> $text->raise($gauge);
> 
> my $toggle = 1;
> my $count = 0;
> Glib::Timeout->add (50, 
>                  sub { 
>                     $count += $toggle; 
>                   $value = $count;
>                   return TRUE;
>                   }
>         );
> 
> Gtk2->main;
> ###########################################################3
> sub delete_event {
>     $watch->Unwatch;
>     $canvas->destroy;
>     Gtk2->main_quit;
>     return 0;
> }
> ###########################################################3
> sub update_meter {
> 
>     if ( $value <= $min )   { $toggle = 1 }
>     if ( $value >= $max ) { $toggle = -1 }
>     my $pos = $value * PI/$max;
> 
>     my $x   = $width/2      -  $height * .80 * ( cos( $pos ) );
>     my $y   = $height * .80 -  $height * .80 * ( sin( $pos ) )  ;
> 
>    $needle->set( points => [ $width / 2, ( $height * .80 ), $x, $y ], );
>    $text->set(text => $value);   #causes error message on exit
>    return $value;
> }
> 
> ############################################################
> __END__ 
> 
> 
> 

Attachment: gauge-new.pl
Description: Perl program

_______________________________________________
gtk-perl-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/gtk-perl-list

Reply via email to