您现在的位置:中国下载站学院中心网络编程Perl应用教程PERL应用教程 → 文章列表

用 Perl 进行 GNOME 编程

作者:佚名  来源:不详  发布时间:2006-12-29 13:50:01   

减小字体 增大字体

 
 
 

GNOME 是一个 UNIX 下的桌面系统,它提供了在 Unix 下编写图形程序的环境,支持鼠标拖放,程序间通信,CORBA 组件(也就是在 Windows 里面的 OLE),CORBA 组件是一组标准的,美观的编程接口,以及所有其它现代的图形应用程序应该包含的特征。所有这些都能在 Perl 的完成,也就是 Perl 程序员能够用GNOME 库来编写整洁漂亮的应用程序,但是这儿也有一点小小的问题。。。

% perldoc GNOMENo documentation found for "GNOME".
没有GNOME编程的帮助文档!。我最近需要写一个基于 GNOME 库的图形界面应用程序,就遇到了这个问题。我不得不自己解决所有的问题。所以我写了这个教程,来帮助亲爱的读者朋友,使你们不用也事事亲为。首先,放松一下,我们将创建一个极为简单,但是却很完整,很标准的 GNOME 应用程序

GNOME系统构成简介

整个 GNOME 系统非常的复杂,由很多的库和组件组成。幸运的是,教学及日常大部分的程序,你都只需要知道其中的两个部分: GTK+ 和 GNOME.

可能你已经听说过了 TK,另一个 Perl 程序员经常用到的图形工具库.Tk 所扮演的角色主要是与 X 窗口服务器通信,告诉它怎样画一个按钮,菜单,控制栏,对话框等,根据用户的点击情况执行相应的 Perl 子程序.Tk库一方面用到了 Perl 的便捷,另一方面又不得不与虽然强大但是却很原始难懂的X窗口系统打交道.

GTK+ 也完成相似的任务,但是却更简单。GTK+ 提供所有的窗口,按钮,文本标记,文本输入框,一切我们的程序用的到的图形控件。而且,严格的说还提供主窗口事件等待循环,以便监视用户的动作。

GNOME 库则在 GTK+ 的基础上进行了更高一个层次的抽象,为我们提供更高层的图形对象,比如主应用程序窗口,弹出窗口,按钮板,对话框,颜色字体选择器,甚至还提供与GNOME环境中其它部分的粘合交互通信,比如拼写检查,计算器及其它应用程序资源

* 这里值得指出,有一个VB风格的集成图形编程环境,叫 Glade,支持像 VB 一样拖放控件。它能自动产生 Perl 代码,用 Glade 你会发现开发图形界面十分简单,但是我们还是建议你应该把这个教程看下去,这样你才能看懂那些产生的 perl 代码。

Hello,World

这里我们展示经典的 “Hello,World” 程序的两个版本,一个用 GTK+ 实现,一个用 GNOME 实现

GTK+ 版: 

   1 #!/usr/bin/perl -w   2   3 use strict;   4 use Gnome;   5    6 my $NAME = 'Hello World';   7   8 init Gnome $NAME;   9  10 my $w = new Gtk::Window -toplevel;  11  12 my $label = new Gtk::Label "Hello, world";  13 $w->add($label);  14  15 show_all $w;  16   17 main Gtk;

在第四行,装载 Gnome 模块,这样就将一并装载其下的 GTK+ 模块。第八行注册并初始化这个程序,分配我们在该程序中需要的资源,init 语句后面根这个程序的标题,它将显示在标题栏。 

在第十行,创建主窗口,也就是最顶层的窗口,它不是任何其它组件的子窗口。然后,我们创建内容为 “Hello,world” 的消息文本标签,任何我们想要在窗口中显示的文本都必须是派生于 Gtk::Label 对象的实例,在第十二行我们就是这样做的,并把派生的实例命名为 $label。但是仅仅是第十二行的一条语句没有任何作用,它仅仅创建了文本,却不能显示在任何地方显示出来。未了在窗口中显示它,我们必须用窗口的 add 方法把这个标签实例添加到待显示列。

然后,我们决定在程序启动的时候应该显示上面。如果我们想要显示窗口中包含的所有的东西,在这里也就是那个消息文本标签,我们就需要调用窗口的 show_all 方法。注意,调用了 show_all 后窗口仍不会被显示,show_all 方法只是申明了程序运行的时候待显示的内容。

最后,main Gtk 这条语句将把程序的控制权交给 GTK+ 的主事件等待循环,GTK+ 的主事件等待循环首先在屏幕上绘出窗口,在窗口里显示出文本,然后就等待用户的点击等动作了。

*一旦运行到 main Gtk 语句,程序的状态就不确定了,以后发生的一切都要依赖于用户的动作。不象程序员通常编程时为整个程序设计好所有的运行流程,现在我们必须要适应这个被动的角色,要更具用户的动作来做出相应的响应,而要实现这一点,正如我们在后面看到的一样,多少得靠子函数。再次申明,当程序运行到 main Gtk 的时候,我们的工作就算完成了,而 GTK+ 监视用户动作则刚开始。

下面这个是程序的Gnome版:

     1  #!/usr/bin/perl -w     2       3  use strict;     4  use Gnome;     5       6  my $NAME = 'Hello World';     7       8  init Gnome $NAME;     9      10  my $app = new Gnome::App $NAME, $NAME;    11      12  my $label = new Gtk::Label "Hello, world";    13  $app->set_contents($label);    14      15  show_all $app;    16      17  main Gtk;

和上面的Gtk+版一样长,而且大部分语句都是一样的,下面这处有改动:

10 my $app = new Gnome::App $NAME, $NAME;
不象在Gtk+中我们申明创建一个窗口,在这里我们从更高一层声明创建一整个程序。把程序的名称传递给 new,而且传递了两个。第一个是作为窗口的标题,第二个则是在 GNOME 的环境中对该程序进行注册。 把文本标签添加到窗口的语句也有变化:
13 $app->set_contents($label);

为什么在这里用 set_content 方法而不用 add 方法呢?这是由 GTK+ 把图形元素(也就是控件)显示在窗口中的方法决定的,GTK+ 如何显示图形元素由包含该图形元素的上一层元素,或称容器决定。通常,一个窗口只能放一个控件。但幸运的是很多控件都能自身包含其它的控件。而我们上面的那条语句则是申明,在窗口中只能放置文本标签类控件。 到现在你可能已经注意到了一点,当你用 GTK+ 编写好程序并运行它,然后点击程序中的退出按钮你却并不能退出,而不得用 Ctrl+C 或类似的强制方法退出。GNOME 中不存在这样的问题。当 GNOME 程序从窗口管理器中收到退出的通知时,它会给自己发送一个信号,当然不是 UNIX 内核中发送的那种信号,而是纯粹的 GNOME 特色的信号。我们需要捕捉这个信号,并且给这个信号编写一个相应的信号处理程序来退出程序。下面的语句就是完成这个功能:

    my $app = new Gnome::App $NAME, $NAME;    signal_connect $app 'delete_event',                         sub { Gtk->main_quit; return 0 };
我们指定了一个程序来处理 “delete event“ 信号,“delete event”信号意味这退出当前子程序,返回上一级程序。我们用一个匿名子程序来捕捉并处理它—-GTK+ 中的 main_quit 方法,这个方法将终止程序的主事件等待循环。

现在我们的程序就会完全的退出了。但是现在这个程序还不能做什么。


itbulo.com/post.php?action=newthread&fid=51&extra=page%3D1" title="如有错误,麻烦请及时告诉我们,谢谢。" target="_blank">我要纠错】【itbulo.com/" target="_blank">进入论坛交流】【关闭此页】【iTbulo.net/" class="lblue" target="_blank">进入博客】

添加菜单条

像前面提到的,GNOME 优于 GTK+ 的地方在于,它提供更多我们在应用程序中需要用到的标准控件。现在来为我们的程序添加一个标准的菜单。在 signal_connect 语句后添加下面的内容

 $app->create_menus(        {type => 'subtree',         label => '_File',         subtree => [                {type => 'item',                 label => 'E_xit',                 pixmap_type => 'stock',                 pixmap_info => 'Menu_Quit'                }                    ]        },        {type => 'subtree',         label => '_Help',         subtree => [                {type => 'item',                  label => '_About...',                 pixmap_type => 'stock',                 pixmap_info => 'Menu_About'                }                    ]        }      );

我们为 create_menus 传递了一系列匿名的散列,每个散列都代表菜单中的一项。每个散列中的 subtree 关键字指明当前项下面还有子项。在散列的 label 关键字的值中,我们可以在需要定义为快捷键的字母前


在百度中搜索更多用 Perl 进行 GNOME 编程相关网页 转贴于:中国下载站

  • 上一篇文章:使用PERL脚本生成PDF输出
  • 下一篇文章:如何撰写POD
  • 阅读统计:[]
  • 中国下载站】【设为主页】【收藏本页】【打印本文】【回到顶部】【关闭此页

    相关文章
    文章评论(评论内容只代表网友观点,与本站立场无关!)

    用户名: 查看更多评论

    分 值:100分 85分 70分 55分 40分 25分 10分 0分

    内 容:

             (注“”为必填内容。) 验证码: 验证码,看不清楚?请点击刷新验证码


    设为首页 - 关于我们 - 广告服务 - 网站地图 - 加入收藏 - 网站声明 - 网站帮助 - 友情链接

    • Copyright (C) 2006-2008 www.cndownz.com All Rights Reserved.
      中国下载站 版权所有. 粤ICP备05141802号. 对本站有任何建议、意见或投诉,请来信:cndownzcom@yahoo.com.cn.
      喜欢中国下载站(cndownz.com),请把中国下载站(cndownz.com)告诉你QQ上的5位好友,多谢支持!