Не могу рисовать линии в GooCanvas - PullRequest
0 голосов
/ 15 февраля 2019

В скрипте Perl / Gtk3 и с помощью GooCanvas я могу легко нарисовать прямоугольник, или многоточие, или что-то еще, но кажется невозможным нарисовать простую линию.

Линии нарисованы с помощьювызов Goo :: CanvasPolyline-> new ().Координаты строки задаются при вызове Goo :: CanvasPoints-> new (), но этот вызов создает следующую ошибку:

GLib-ERROR **: ../../../../glib/gmem.c:105: failed to allocate 18446744069314558208 bytes at /usr/lib/x86_64-linux-gnu/perl5/5.26/Glib/Object/Introspection.pm line 67.
Aborted (core dumped)

Я пробовал Perl-модуль Goo :: Canvas и болеесовременный GooCanvas2;оба выдают одну и ту же ошибку.

Я не смог найти ни одного примера рабочего кода;просто нерабочий скрипт ниже, который Google нашел на $ RANDOM_WEBSITE.

#!/usr/bin/perl -w
use strict;
use warnings;
use Gtk3 -init;

Glib::Object::Introspection->setup(basename => 'GooCanvas', version => '2.0', package => 'Goo');


my $window = Gtk3::Window->new('toplevel');
$window->signal_connect('delete_event' => sub { Gtk2->main_quit; });
$window->set_size_request(640, 600);
$window->set_title("Gtk3 GooCanvas with Perl Gobject Introspection");
$window->signal_connect(destroy => sub { Gtk3->main_quit });

my $swin = Gtk3::ScrolledWindow->new;
$swin->set_shadow_type('in');
$window->add($swin);

my $canvas = Goo::Canvas->new; # Gobject Introspection of Gtk3 Goo version
$canvas->set_size_request(800, 650);
$canvas->set_bounds(0, 0, 1000, 1000);
$swin->add($canvas);
my $root = $canvas->get_root_item();

# first point set
my $pts_ref = [50,50,180,120,90,100,50,50];

my $points = Goo::CanvasPoints->new(
         $pts_ref,
         );

my $line = Goo::CanvasPolyline->new(
   'parent' => $root,
   'close-path' => 0,
   'points' => $points, #in Gtk2 could just use $pts_ref
   'stroke-color' => 'black',
   'line-width' => 3,
);


my $ellipse = Goo::CanvasEllipse->new(
   'parent' => $root,
   'center-x' => 20,  
   'center-y' => 20,  
   'width'  =>  +60,
   'height' =>  +60,  
   'stroke-color' => 'goldenrod',
   'line-width' => 8,
   'fill-color-rgba' => 0x3cb37180,
);


$root->translate(200,200);

$window->show_all();
Gtk3->main;
__END__ 

1 Ответ

0 голосов
/ 15 февраля 2019

my $points = Goo::CanvasPoints->new( $pts_ref );

Согласно документации конструктор должен взять количество точек для резервирования, а не ссылку намассив точек.Так что вы можете попробовать:

[...]
# first point set
my $pts_ref = [50,50,180,120,90,100,50,50];
my $num_points = (scalar @$pts_ref)/2;
my $points = Goo::CanvasPoints->new( $num_points );

# Set the points:
my $j = 0;
for my $i (0..($num_points -1)) {
    my $x = $pts_ref->[$j];
    my $y = $pts_ref->[$j+1];
    $points->set_point($i, $x, $y);
    $j += 2;
}
[...]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...