StupidBeauty
Read times:1137Posted at:Mon Sep 13 19:40:55 2010 - no title specified

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;

截图: