a couple of Gnome2::Canvas problems



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__ 



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



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]