Perl-Gtk2初次使用,碰到问题
这是学习 perl的图形界面编程时 从 IBM网站上一个地方找到的代码,它说的是用gtk2做界面:
#!/usr/bin/perl
$type='toplevel';
$filename='Beauty.png';
my $win=Gtk2::Window->new($type); ##
#my $win=Gtk2::Window->new('toplevel'); ##
$win->set_title("Test for window");
$win->set_default_icon_from_file($filename);
$win->set_size_request("1234","567");
$win->set_position('center');
$hint='normal';
$win->set_type_hint($hint);
$win->signal_connect('destroy',sub{Gtk2->main_quit});
本座直接把这代码拿来执行了,结果遇到第一个错误,没有导入Gtk2的库:
Can't locate object method "new" via package "Gtk2::Window" (perhaps you forgot to load "Gtk2::Window"?) at ./Gtk2WindowNoInit.pl line 5.
于是本座按照它的提示,加上了 “use Gtk2::Window”。结果又报告说 “Gtk2/Window.pm”不存在 。这很正常 ,如果没安装那么它就不存在了。结果本座去CPAN里面想要安装 “Gtk2::Window”,CPAN又说没有这个模块。那就去查了,原来“Gtk2::Window”就是Gtk2这个模块里面的东西,那么就安装“Gtk2”这个模块了,前面的“use Gtk2::Window”就改成“use Gtk2”了。
#!/usr/bin/perl
use Gtk2;
$type='toplevel';
$filename='Beauty.png';
my $win=Gtk2::Window->new($type); ##
#my $win=Gtk2::Window->new('toplevel'); ##
$win->set_title("Test for window");
$win->set_default_icon_from_file($filename);
$win->set_size_request("1234","567");
$win->set_position('center');
$hint='normal';
$win->set_type_hint($hint);
$win->signal_connect('destroy',sub{Gtk2->main_quit});
结果又有问题了,空指针:
GLib-GObject-WARNING **: invalid (NULL) pointer instance at ./Gtk2WindowNoInit.pl line 7.
GLib-GObject-CRITICAL **: g_signal_connect_data: assertion `G_TYPE_CHECK_INSTANCE (instance)' failed at ./Gtk2WindowNoInit.pl line 7.
本座又去查,好多人碰到这样的空指针问题了,但是没看到跟这个问题相关的。也可能是因为本座看到英语就没兴趣去看了 ,因此漏过相关的网页了。反正没找到原因 。
本来没打算解决这个问题了 ,因为本座对PERL是初学,只是刚开始写了几百行代码,对于GTK2更是这次才第一次接触。
但是非常遗憾的是本座实在是比较走运 ,突然想看看 GTK2模块的文档了 ,一看,发现了文档里面的一个示例:
use Gtk2 -init;
# Gtk2->init; works if you didn't use -init on use
my $window = Gtk2::Window->new ('toplevel');
my $button = Gtk2::Button->new ('Quit');
$button->signal_connect (clicked => sub { Gtk2->main_quit });
$window->add ($button);
$window->show_all;
Gtk2->main;
开头的这样两行:
use Gtk2 -init;
# Gtk2->init; works if you didn't use -init on use
它的意思应该是,在“use”语句中使用“use Gtk2 -init”,或者,如果不在“use”语句中加上“-init”的话,就在下面的代码里面加上一句“Gtk2->init”。本座就试试。
#!/usr/bin/perl
use Gtk2;
$type='toplevel';
$filename='Beauty.png';
Gtk2->init;
my $win=Gtk2::Window->new($type); ##
#my $win=Gtk2::Window->new('toplevel'); ##
$win->set_title("Test for window");
$win->set_default_icon_from_file($filename);
$win->set_size_request("1234","567");
$win->set_position('center');
$hint='normal';
$win->set_type_hint($hint);
$win->signal_connect('destroy',sub{Gtk2->main_quit});
果然没有空指针错误了啊,但是没有弹出窗口,而且什么输出都没有 。
再去看看那个示例 ,原来示例末尾还有这样两行 :
$window->show_all;
Gtk2->main;
这下好理解了,根据本座的经验,第一句应该是用来弹出窗口的,第二句应该是用来进入GTK2的消息循环的。
在代码里面加上类似的两句之后,果然窗口弹出来了,嘿嘿。代码:
#!/usr/bin/perl
use Gtk2;
$type='toplevel';
$filename='Beauty.png';
Gtk2->init;
my $win=Gtk2::Window->new($type); ##
#my $win=Gtk2::Window->new('toplevel'); ##
$win->set_title("Test for window");
$win->set_default_icon_from_file($filename);
$win->set_size_request("1234","567");
$win->set_position('center');
$hint='normal';
$win->set_type_hint($hint);
$win->signal_connect('destroy',sub{Gtk2->main_quit});
$win->show_all;
Gtk2->main;
截图:
其实要是早去问盖盖就好了,嘿嘿。
Your opinionsHxLauncher: Launch Android applications by voice commands