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());
}
我正在尝试制作自定义 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());
}