undef 不是 Gtk2::Gdk::Drawable 类型 - gtk2-perl 自定义小部件 - 调用 GtkWidget 的 window 方法

undef is not of type Gtk2::Gdk::Drawable - gtk2-perl custom widget - calling window method of a GtkWidget

我正在尝试制作自定义 Perl Gtk2 小部件。当我尝试访问 GtkDrawingArea 的 window 属性 时,它 returns undef 而不是 GdkDrawable 对象。根据 the Gtk2-Perl documentation,此方法可以 return window 对象或 undef,但不清楚它在什么条件下 return 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;

查看 this example 我发现我需要等待小部件的公开事件才能对其进行绘制,因为 window 直到该事件才被创建。此外,代码需要更好地适应 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());
}