岁月联盟 · 中国技术网 本站主页 | 安全认证 | 用户服务 | 技术论坛
新闻快报 | 新手学堂 | 黑客特区 | 程序语言 | 数 据 库 | 防 火 墙 | 路由交换 | 系统集成 | 服 务 器 | 存储备份 | 考试认证
Windows | Linux | Java | 协议分析 | 问题解答 | 进程大全 | 网页设计 | 多 媒 体 | 图库资料 | 软件下载 | 站内下载
  您现在的位置: 岁月联盟 >> Linux频道 >> Linux编程 >> Perl编程 >> Linux频道正文
使用 Perl/Tk 把 GUI 加入服务器编程
作者:未知 文章来源:本站整理 点击数: 更新时间:2007-7-10 16:37:20

  作为系统程序员,您习惯性地使用命令行界面。可能您已不了解用轻量级图形用户界面(graphical user interface,GUI)来包装现有的功能是多么地容易。新发布的 Perl/Tk 及时地提醒您高质量有时候伴随着易用性。
  
  您可以把精力集中放在高产量的服务器端编程上,而有时仍然可选择使界面更漂亮。此外,轻量级工具箱(例如 Perl/Tk)使这样做成为可能并且使您不必付出更为引人注目的 GUI 方法的代价。
  
  工具箱纵览
  代价是什么?一般来说,与 GUI 的对应的面向命令行的亲戚相比,GUI 的编程、测试、移植和部署更为困难。人们广泛认可 Microsoft Visual Basic(VB)对 GUI 构造的简化。然而,VB 实际上被孤立在 Windows 世界中,作为一门编程语言,它显得有点简陋,这些问题约束了 VB;如果您想详细了解这些缺点,请参阅本文末尾的参考资料。虽然 Java、GTK+ 和 Qt 已被人们接受并用于 Linux 和相关的开放源代码开发,但是为了开始使用它们,您需要花去很多时间来学习并编写很多行代码;它们的“进入门槛”阻碍了从面向字符编程向 WIMP(windows-icons-menus-pointers,窗口-图标-菜单-指针)编程的悄然转变。
  
  虽然用户交互的 Web 模型过于简化,但对于许多小任务来说,它已足够了。事实上,我的大部分 GUI 编程是关于 Web 应用程序的。
  
  然而,有时候 Web 的模型是不够的。您需要更成熟的可编程性或不同的安全性模型。有时候,您只是需要“另一个源”;Web 服务器的基于 Web 的控制面板会使系统太脆弱。有时候,Web 的模型太大了:常见的服务器和客户机使用很多内存并需要配置。
  
  但是,我有好消息。请保持高产量的系统编程习惯。请使用轻量级高级语言绑定(例如 Perl/Tk 或 Tkinter)。您将得到您已开发的程序的可移植的、可维护的、“GUI 化”的版本,这些版本能够良好地运行,您将对此感到惊奇。
  
  无论您喜爱的语言是 Ruby 还是 Fortran,正确的附件都将给您类似的机会。下面是一个已熟悉 Perl 的程序员成功的例子。
  
  准备学习 Perl/Tk
  您了解 Perl。它很简洁,而且这种简洁是巧妙的,这使您能在五分钟内编写报告生成器、网络探测、文本过滤器和进程监视器,如果使用其他语言的话需一天的时间才能完成。
  
  然而,您可能不知道,只要再加几行代码,您就能把 Perl 应用程序变为表现出色、漂亮的 GUI 应用程序。在 developerWorks 上有一篇 Teodor Zlatanov 的文章(请参阅参考资料,其中有这篇文章的链接),这篇文章描述了 cfengine 和相关的 Perl 实用程序,还为您演示如何编写易用的工具,例如关闭所有 inetd 进程的短小的脚本:
  
  清单 1. kill_inetd.pl 的源代码 
  use Proc::ProcessTable;
  
  $t = new Proc::ProcessTable; 
  
  foreach $p (@{$t->table}) {
      # note that we will also kill "xinetd" and all processes
      # whose command line contains "inetd"
    kill 9, $p->pid if $p->cmndline =~ 'inetd';
  }
  
  如果您需要关闭几个有问题的 CGI 进程,怎么办?或者,如果您需要比相当残酷的“kill 9”更得体地发送信号,怎么办?如果您不在的时候您的老板或后备人员需要使用这个脚本,怎么办?传统的答案是打开编辑器、把 inetd 替换成 cgi 等,然后从命令行再次运行 perl kill_inetd.pl。
  
  然而,请把第一个清单转换成清单 2:
  
  清单 2. 修改后的 kill_inetd.pl 的源代码 
  
  use Proc::ProcessTable;
  use Tk;
   
   
  sub kill_them {
    $t = new Proc::ProcessTable; 
    foreach $p (@{$t->table}) {
      kill $signal, $p->pid if $p->cmndline =~ $keyword;
    }
    $result_text = "Signal $signal sent to all '$keyword' processes.";
  }
  
  $main = MainWindow->new();
  $main->Label(-text =>
     "Control panel for killing processes\n  enter keyword here")->pack();
  $main->Entry(-textvariable => \$keyword)->pack();
  $radiobutton_frame = $main->Frame->pack();
  $radiobutton_frame->Radiobutton(-text => "KILL",
            -variable => \$signal,
            -value => 9)->pack(-side => left);
  $radiobutton_frame->Radiobutton(-text => "TERM",
            -variable => \$signal,
            -value => 15)->pack(-side => left);
  $main->Button(-text => "Send kill signal to named processes",
         -command => \&kill_them)->pack();
  $main->Label(-textvariable => \$result_text)->pack();
  
    # Set reasonable defaults.
  $keyword = "inetd";
  $signal = 9;
  
  MainLoop();
  
  当您在运行清单 2 时,您将得到一个较小的但有用的 GUI 控制面板:
  
  简单的信号发送控制面板
  

  用户把它弹出一次后就可以方便地使用它而不必再输入。
  
  不过,请注意这二十一行的脚本为您省去的东西:您没有长达几页的声明和配置。您没有任何许可证限制(除了您熟悉的 Perl 许可证)。您不必学习新的语言。
  
  新的地平线
  这是令人兴奋的东西。您可以使用简短的 GUI 脚本来包装所有的、现存的、用 Perl 代码编写的应用程序以使它们成为同样交互的、“方便用户”的程序。事实上,您可以容易地重写您现有的实用程序以使它们能够在收到合适的命令行参数时继续以正常的“批处理”方式运行,但在其他情况下能够执行另一个分支并构造 GUI 窗口:
  
  清单 3. 在命令行与 GUI 操作之间作出选择
    

[1] [2] 下一页


  • 上一个Linux频道:
  • 下一个Linux频道:
  •  
    热门文章
    推荐文章
    关于我们 | 发展历程 | 网站地图 | 广告服务 | 招贤纳士 | 战略合作 | 友情链接 | 著作声明 | 联系我们
    Copyright © 2002-2007 SYUE All rights reserved.
    E_mail:Admin@Syue.Com 皖ICP备05004589号
    未经授权禁止转载、摘编、复制或建立镜像.如有违反,追究法律责任.
    天龙八部私服 传世私服 传奇世界私服 传奇私服 bet365 天龙八部私服 热血江湖私服 英雄合击传奇私服 热血江湖私服 bet365 bet365