文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>Mastering Perl/Tk 2

Mastering Perl/Tk 2

时间:2007-06-15  来源:dingding

1.2. 一些 Perl/Tk 的历史

Perl/Tk 扎根于 X Window 系统和 Tcl 语言。因此,让我们追溯一下历史,来看一看 Perl/Tk 的起源和发展。

1.2.1. X Window 系统和 Xlib 库

X Window 系统( 也被称作 "X" 或者 "X11" ),作为一个 Unix 系统的图形化平台首先发布于1987年。象大部分 Unix 软件一样,X 应用程序绝大部分是由 C 语言写的,也会用到 Xt,Motif 这样的图形库,更有一些不幸的人或者勇敢的人会使用底层的 Xlib 函数库来构建他们的 X 应用。

可以说你可以用 Xlib 来做任何一件你想做的事情,但同时带来的烦恼是你也必须亲自动手处理每一件事。举个例子,比如你要做用 Xlib 做一个简单的下拉菜单(这如果用 Tk 来做,只是一句语句罢了)。首先,你得确定最长的菜单项的尺寸。为了便于讨论,我们假设菜单的标签字符串是在变量 menu_item 中。 子例程 XTextExtents 决定了 menu_item 的一些属性,例如,通过将最大的上升沿和下降沿(分别即基线以上及以下的像素)相加,得出目前字体显示的菜单项的整体宽度和高度(像素为单位)。在解决了菜单项的数量,边框的宽度,(你也可以适当地多算一点),我们就可以得出菜单窗口的尺寸,以及在主窗口中它的相对位置了。

  XTextExtents( font_info, menu_item, strlen( menu_item ),
    &direction, &ascent, &descent, &overall );
  menu_width = overall.width + 4;
  menu_pane_height = overall.ascent + overall.descent + 4;
  menu_height = menu_pane_height * menu_pane_count;
  x = window_width - menu_width - ( 2 * menu_border_width );
  y = 0;

使用合适的边框和背景颜色参数调用 XCreateSimpleWindow,实际上已经画了一个菜单,至于为什么你什么都看不到,那是因为主窗口还没有绘制呢。

  theMenu = XCreateSimpleWindow( theDisplay, theWindow,
    x, y, menu_width, menu_height,
    menu_border_width, theBorderPixel,
    theBackgroundPixel );

有一点你必须了解,每个菜单项目本身就是一个很小的窗口,所以在构建你的菜单时候,你必须创建所有的这些菜单项,并保存这些菜单项的结构指针,来以后回调它们,同时还必须为可能会有的各种事件编写代码。在考虑这些前,不知道你注意到没有现在我们还没有绘制菜单项的真实的文本(你点击菜单项看到的)。为了绘制这些,我们需要定义字体,相应的图标项,然后调用 XDrawImageString 来描绘出这些字符(你可能在初始化和事件句柄的代码中都会发现这样的应用):

  for( i = 0; i < menu_pane_count; i++ ) {
    menu[i].menu_pane = XCreateSimpleWindow(
      theDisplay, theMenu, 0, menu_height/menu_pane_count*i,
      menu_width, menu_pane_height, menu_border_width = 1,
      theForegroundPixel, theBackgroundPixel );
    XSelectInput( theDisplay, menu[i].menu_pane, EVENT_MASK3 );
  }
 
  XMapSubWindows( theDisplay, theMenu );

符号常量 EVENT_MASK3 列举了菜单项窗口的可能会用到的事件:

#定义 EVENT_MASK3 ButtonPresMask | ButtonReleaseMask |
  ExposureMask | EnterWindowMask | LeaveWindowMask

现在我们还必须写每一个事件句柄,甚至构建窗口,构建事件队列,构建我们自己的事件分发器,等等等等这些都必须我们自己来完成。疯掉了!

可能使用 Motif 或 Xt 高级图形库来编程的话会多多少少更加方便一点,但是有时也会让你手足无措。一个主要的令人头痛的情况是:不管你使用什么库来编写你的 X 应用,X 应用都紧紧和 C 语言结合在一起。 C 是一个很好的语言,但是你必须在 C 语言方面达到专业水平,你才有本事去实现一个 X 应用。 — 一般有这种专业水平的人大凡是 C 语言的痴迷狂热爱好者要么就是一个黑客,他们才没有空去帮你做这样一个 X 应用呢。许多公司都不会愿意花费时间和资源去开发一个 C 应用程序的,如果你需要开发一个内部使用的工具(诸如bugs跟踪工具这样的需求),你最好还是早点在你的设计书画上一个命令行结束符,早点打消你的念头吧。

Something had to be done, and something was.

1.2.2. Tcl/Tk 的产生

The Tool Command Language (Tcl) 是由 John K. Ousterhout 在1987年开发的,他当时是伯克利大学的教授。 Ousterhout 当时想要开发一种可嵌入的,灵活的命令脚本语言来重用许多不同的应用。每一种应用可能会继承一些同一种的基本特性,诸如控制结构,标量变量,数组,以及内置过程。然后,每个不同的应用再在这个基础上加上它自己专有的,独特的命令,这些命令的形式,使用跟任何其他的 Tcl 命令一样,没有什么大区别,你可以很容易的学会使用。 [2]

[2] 早些年,Control Data 公司在它们的操作系统 NOS/VE上,提出并应用了一种嵌入式,可扩展性脚本命令语言的逻辑方案。这个命令语言被叫做 System Command Language (SCL),从这个语言的叫法你也可以知道,它在整个操作系统范围内被使用,包括组件,编译器,调试器,终端服务器,终端用户脚本和应用。任何一个应用都能嵌入任何其它的应用中— 这个过程都是自动进行的,只要操作系统允许—不需要任何用户自己动手的工作。这样构建出来的应用,结构代码对称,协调,这也是 Tcl 一大优势。

但是 Ousterhout 教授需要证实他的观点,既对自己也是对执怀疑态度的其他人。由于他对 GUI 有着很大的兴趣,所以他设计了基于 Tcl 的图形组件开发工具箱。他向外界宣称,使用这个开发工具箱开发图形要比用 C 语言实现起来更加有效和方便,甚至要比使用 Motif 还要高效。他的说法被证明确实是对的,很快他又带给我们另一样好东西:一个图形开发工具箱 Tk,Perl/Tk 也就是从这里诞生的。

在1991年初,Ousterhout 发布了 Tk 1.0版,一个 Tcl 脚本语言的图形化扩展。内含的 Tk 的高级组件装(基本上都是用 Xlib 和它的绘图包开发的)是最直接的成功。在接下来的几年里,成千上万的 Tcl/Tk 应用程序使用 Tk 开发出来,同时 Tk 被改制到各种脚本语言中去,如 Eiffel, Modula-3, Prolog, Python, Scheme 等。

到1993年11月份为止,Tcl/Tk 已经发布到了3.4版,不管你信不信,那个时候,使用 Tcl/Tk 在 Perl 程序外面包裹上图形化界面是大部分人的做法。如果 Perl 程序员们不觉的 使用 Tk 对他们很有帮助的话,牛津大学的学生 Malcolm Beattie 也不会在那个时候去开发什么 TkPerl 项目的。 [3]

[3] 即便将来 TkPerl 不在应用了,你也不需要担心,因为 Malcolm 在 CPAN 上发布有两个模块,都能允许你在 Perl 脚本直接使用 Tcl/Tk 命令。当然,这样的使用依赖于你的 Tcl/Tk 库,所以你必须确保你安装了 Tcl/Tk。

1.2.3. Perl/Tk 的演变

Malcolm 的目标是纯 Perl 5 中包含面向对象的 Tk 接口,而不需要再依靠 Tcl 了,这样做意味着必须将 Tcl 的代码转换成 Perl 的,还要些 外部子例程来使的 Perl 能调用 Tk C 库的程序。在这些年,Tcl/Tk C 子例程反反复复在改变字符串类型,这样使得 Tcl/Tk C 的一些数据类型跟 Perl 的本地数据类型不是配合的很好,这也就导致了 Tk 和 Perl 的联姻变得很复杂。尽管如此,到1994年夏天为止,TkPerl 还是在发布第一个测试版时得到了广泛的应用(除了文本组件和一些少量的很少应用的命令和绑定)。

下面是一个早期的 TkPerl "Hello World" 程序:

use Tk;
$mw = tkinit;
$b = Button::new($mw, -text => 'Hello World');
$b->configure(-method => sub {exit});
tkpack($b);
tkmainloop;

如果这个程序,你看起来很别扭,不要急,因为这是将近8年前的一个程序了,那个时候, TkPerl 还只是发布了第一个测试版,Perl 的面向对象的特性还仍然在测试中。值得注意的是,这时候还没有组件方法的概念,只能暂时用 包 模拟, Tk包只能暂时叫做 tkpack 以防止在同一名称空间中与 Perl 的其他内置函数混淆。但说到底,虽然有很多不尽人意的地方,但是毕竟我们可以用它来在 Perl 中使用 Tk,这毕竟就是我们的目标。

在那段时间里,另一个英国的家伙,Nick Ing-Simmons 开始认真地钻研 TkPerl。他和 Malcolm 一起合作了一段时间,紧接着,他们相互达成一致,由 Nick 来继续开发。从此,Perl/Tk 就开始有了最早的雏形,nTk(你可以说 new Tk,也可以说是 Nick's Tk)。 Perl/Tk 从那时开始慢慢地发展到今天的样子。在1995年五月,又有了一个叫法上的改变,Nick's package 被改叫作 pTk(你可以说 pure Tk ,也可以说是 portable Tk,或者就是 Perl/Tk)。在 Perl/Tk 的演变历史中,用户贡献的组件以及 Ioi Kim Lam 开发的 Tk 接口扩展 (Tix) 组件都对 Perl/Tk 发展的起着推动。这些 Tk 都是基于 Tcl/Tk 4.x 版本(这个版本只能用于 Unix 系统)。

还记得我们给你看的 Xlib 代码吗?图 1-1 显示一个简单的 Perl/Tk 窗口。

图 1-1. Hello, Perl/Tk

这个窗口是由下面的 Perl 一行代码产生的:

perl -MTk -e 'MainWindow->new->Label(-text => "Hello, Perl/Tk")->pack; MainLoop'

这个例子能精辟地展现给我们已经使用 Perl/Tk 到什么程序了。

1.2.4. 当 Perl/Tk 遭遇 Win32

Tcl/Tk 风光无限的这段时期内,Tcl/Tk 开发团队的成员们并没有在取得的辉煌成绩上踏步不前。到1995年夏天的时候,Tcl/Tk 8.x [4] 已经能够运行在 Win32 平台上。而且 Win32 平台上运行的 Tcl/Tk 不管是看起来还是用起来已经做的跟其他平台上运行差不多了。又过了两年, Perl/Tk 也开始移植到了 Win32 上。 [5]

[4] Tk 直接从 4.x 版本升级到了 8.x ,而跳过了 5.x,6.x,或者 7.x 版本,这样做是为了配合 Tcl 版本的更新。这样做也是为了能够让开发人员很方便的知道他们手中的 Tk 是对应哪个版本的 Tcl。

[5] 这仅仅是指,在 Windows 上。到写这篇文章的时候,Perl/Tk 还不能在 Mac OS 上运行。

1997年夏天,一个著名的受人尊敬的 perl 守护神,Gurusamy Sarathy 开发了专为 Window 95 和 Windows NT 发布的 Perl 5.004 和 Tk 40x.000 (包括其他有用的模块)二进制安装版本。这一重要举措也使得 Perl/Tk 在世界范围内的下载安装呈指数级的增长。到那个时候,唯一主要的抱怨就集中在 Perl/Tk GUI 界面看起来太像 Motif 了(毕竟 Perl/Tk 最早起源于 Unix)。

Nick,作为一个有着非凡编程能力的计算机专家,在这个时候也没有闲着,在1998年年初的时候,他就已经将 Perl/Tk,Tix,Jan Nijtmans 的图形包和 Tcl/Tk 8.0 集成在了一块,这个产品也成为了目前最新的 Perl/Tk 800.000 系列的一个基础。

同时,Sarathy 也在努力集成 Unix 和 Win32 平台上的 Perl 版本,使得各自平台上的 Perl 端口统一标准,以此产生的 Perl 一般被叫做 Oneperl。最终,ActiveState 公司发布了统一的 Perl 二进制安装版本,最近几年,在大部分 Win32 系统平台上用的都是这个版本。

1998年7月份左右,Nick 开发了一个统一标准的 Unix 和 Win32 发布版本,并在 ActiveState 公司的 PPM 仓库里放了一个 二进制的 Perl/Tk 800.010 版本。这一举措也使得 Win32 用户能够方便下载这个 Perl 和 Tk 的二进制安装包。而对于大多数 Unix 用户来说,使用简单的命令,你就可以自己编译 Perl 和 Tk。如果你足够幸运的话,你还能够在网页上搜索的你特定喜好的 Unix 系统的 Perl/Tk 发布版本。

在 Win32 平台上运行 Perl/Tk 程序

不管是在 Unix 还是 Windows 机器上编写 Perl/Tk 应用程序是没有什么分别的。你可以随便在哪个平台上使用文本编辑器。但是,在运行你编写的程序的时候在不同平台上会有一点点不同。

最原始的一般做法是手动调用 Perl 解释器并且在命令行中指定 Perl/Tk 程序的文件名,就像这样:

perl myprog.pl

一个 Unix 用户通常会赋予他的程序一个可执行权限并且确保这个程序的第一行是一个有效的 “bang” 行。这样做就允许用户通过名字就可以调用这个 Perl/Tk 程序。当你调用通过名字调用这个程序的时候, Unix 命令处理器就会调用 shell 程序,检查文件的第一行,如果发现它是以字符 #! 开始的,那么 shell 就会将剩下的行都当作是命令行去执行,当然这些行可能也带有命令参数。 ! 字符是 bang。这样组织的一行将以 -w 开关来调用 Perl 解释器:

#!/usr/local/bin/perl -w

概念上,Win32 用户也可以通过关联后缀名扩展 .pl 和 Perl 解释器来达到同样的效果,以至于 Win32 用户可以用资源管理器和双击脚本来执行它。看 附录 A,“安装 Perl/Tk” 来获得更多的细节。

 

排行榜 更多 +
三角洲行动永久6格门禁卡包权限卡获取方法

三角洲行动永久6格门禁卡包权限卡获取方法

飞行射击 下载
三角洲行动粽子可兑换物品一览

三角洲行动粽子可兑换物品一览

飞行射击 下载
香肠派对SS20摸金玩法详情

香肠派对SS20摸金玩法详情

飞行射击 下载