undef не относится к типу Gtk2::Gdk::Drawable - пользовательский виджет gtk2-perl - вызывает метод окна GtkWidget
Я пытаюсь сделать собственный виджет Perl Gtk2. Когда я пытаюсь получить доступ к window
свойство GtkDrawingArea, оно возвращает undef
а не GdkDrawable
объект. Согласно документации Gtk2-Perl, этот метод может возвращать либо объект окна, либо undef
, но не ясно, при каких условиях он возвращается undef
, Может ли кто-нибудь уточнить это?
#!/usr/bin/perl
use strict;
use warnings;
package Gtk2::MIDIPlot;
use Gtk2;
use base 'Gtk2::DrawingArea';
use Cairo;
sub new {
my $class = shift;
my $this = bless Gtk2::DrawingArea->new(), $class;
$this->set_size_request(14400, 768);
return $this;
}
sub draw {
my $drawArea = shift;
my $thisCairoSurface = Gtk2::Gdk::Cairo::Context->create($drawArea->window);
}
package main;
use Gtk2 -init;
my $window = Gtk2::Window->new();
my $mainWidgetScroll = Gtk2::ScrolledWindow->new();
my $mainWidget = Gtk2::MIDIPlot->new();
$mainWidget->draw($mainWidget);
$mainWidgetScroll->add_with_viewport($mainWidget);
$mainWindow->add($mainWidgetScroll);
$window->signal_connect(destroy => sub{Gtk2->main_quit()});
$window->show_all();
Gtk2->main();
0;
1 ответ
Решение
Глядя на этот пример, я обнаружил, что мне нужно подождать события expose виджета, прежде чем я смогу рисовать на нем, поскольку окно не было создано до этого события. Кроме того, код должен лучше соответствовать стилю настройки GTK, а затем выполнять действия в обратных вызовах.
#!/usr/bin/perl
use strict;
use warnings;
package Gtk2::MIDIPlot;
use Gtk2;
use base 'Gtk2::DrawingArea';
use Cairo;
sub new {
my $class = shift;
my $this = bless Gtk2::DrawingArea->new(), $class;
$this->signal_connect(expose_event => 'Gtk2::MIDIPlot::draw');
return $this;
}
sub draw {
my $drawArea = shift;
$drawArea->set_size_request(14400, 768);
my $thisCairoSurface = Gtk2::Gdk::Cairo::Context->create($drawArea->get_window());
}