有些时候,您可能发现您的需求超过了 shell 脚本以及 dialog 和 Zenity 工具的功能范围之外。在那些实例中,您可能转向 C/C++ 并为桌面构建本机应用程序,但是您还可以使用高级脚本语言和许多强大的 GUI 框架的语言绑定。
一个组合是 Ruby 脚本语言和 wxWidgets 框架的 Ruby 绑定。Ruby 是面向对象的、富于表现力的且简洁的,运行于大部分操作系统之上。wxWidgets 框架还可用于每个主流平台,包括 Mac OS X、Windows?、Linux? 和 UNIX。由于两者都是可移植的,您可以用 Ruby 编写一个应用程序一次,然后随处运行它。另一个更简单的选择是 Shoes。尽管不如 wxWidgets 丰富,Shoes 学习和使用起来相当简单。清单 2 使用 70 行代码实现了一个计算器。
清单 2. 用 Shoes 实现的一个计算器
class Calc def initialize @number = 0 @previous = nil @op = nil end def to_s @number.to_s end (0..9).each do |n| define_method "press_#{n}" do @number = @number.to_i * 10 + n end end def press_clear @number = 0 end {'add' => '+', 'sub' => '-', 'times' => '*', 'div' => '/'}.each do |meth, op| define_method "press_#{meth}" do if @op press_equals end @op = op @previous, @number = @number, nil end end def press_equals @number = @previous.send(@op, @number.to_i) @op = nil end end number_field = nil number = Calc.new Shoes.app :height => 250, :width => 200, :resizable => false do background "#EEC".."#996", :curve => 5, :margin => 2 stack :margin => 2 do stack :margin => 8 do number_field = para strong(number) end flow :width => 218, :margin => 4 do %w(7 8 9 / 4 5 6 * 1 2 3 - 0 Clr = +).each do |btn| button btn, :width => 46, :height => 46 do method = case btn when /[0-9]/; 'press_'+btn when 'Clr'; 'press_clear' when '='; 'press_equals' when '+'; 'press_add' when '-'; 'press_sub' when '*'; 'press_times' when '/'; 'press_div' end number.send(method) number_field.replace strong(number) end end end end end
对 Ruby 和 Shoes 的介绍不在本文讨论范围之内,但是这里是一些最重要的构造:
大多数 Ruby 类 Calc 使用 Ruby 的元编程功能,在运行时为所有数字键和数学操作键定义功能。 代码开头 Shoes.app... 创建计算器的 GUI,为其呈现布局和按钮。Shoes 提供两个容器来装配布局:stack 和 flow。一个 stack 是元素的一个垂直堆栈,其中每个元素直接放在前一个元素下面。一个 flow 尽量紧密地包裹元素,直至它达到其边框局限,然后包装其余的元素。(您可以将一个堆栈看作是一个 HTML <div>,将一个流看作 HTML <p>。)您可以使用 Ruby 块创建一个堆栈或一个流。 最里面的 flow 快循环创建应用程序中的所有按钮,并有效地将每个按钮绑定到其方法。(case 语句返回一个方法名称;number.send(method) 行调用实例化计算器上的那个方法。) number_field.replace strong(number) 行通过最新计算结果更新计算器显示。发出 number 致使类调用其自己的 to_s (“to string”) 方法。其他脚本语言拥有类似的库,且 Ruby 本身有更多选择,包括 Ruby Cocoa,可使用 Ruby 在 Mac OS X 上开发 Cocoa 应用程序。选择您喜欢的开源脚本语言,找到一个轻量级 GUI 工具包,然后开始编码。