人们总是在不断在Ruby GUI领域进行尝试。现已知的老式方法包括:将 Ruby 绑定到 Qt 或者 GTK 这样的用户界面库,或者使用基于 JRuby 的嵌入式 DSL 或者 API 创建 Swing 界面,关于后者,可以看看这边 3 种不同的实现途径。上述几种方法均采用不同的方法创建及排列界面控件。
Ruby Shoes 实现 GUI 的方式则略显不同。Ruby Shoes 出自 Why’s (Poignant) Guide to Ruby 的作者 Why The Lucky Stiff之手,这位高产的开发者还开发了 HPricot (HTML 解析器)、Web 框架 Camping 等许多软件。Why 的Ruby Shoes 工具箱基于 Cairo (绘图)以及 Pango (文本)等 GTK 技术开发,GUI 控件的数目受限于设计,而且现有的控件使用到了系统相关的 GUI 组件。目前我们可以在 MacOSX、Windows 以及 GTK 图形环境下使用它。
Ruby Shoes 用 C 语言实现,并通过 Ruby 扩展库同 Ruby 代码交互。在自述文件中,作者声称受到了 HyberCard 这样的工具包, Processing 以及 NodeBox 这样的语言的启发。我们可以通过 Ruby Shoes 自带的样例代码,看出后面几种专门用于完成可视化(Visualization)任务的近代语言对它的影响。下面的代码片段实现了一个简单的计时器动画:
l = text "0"<br></br>animate(24) do |i|<br></br> l.replace "#{i}"<br></br>end``animate
调用使用一种十分简洁的方法处理动画。数字参数表示了动画的帧速,程序根据该速率执行代码块以更新动画。
Ruby Shoes 还支持通过线条、椭圆以及路径这些基本元素来创建图形,并支持变形、缩放、旋转这样的操作。接下来的这个例子展示了如何响应鼠标的移动。
Shoes.app do<br></br> radius = 20.0<br></br> vert = width - 30.0<br></br> hor = width - 30.0<br></br> o = oval(hor, vert, 10.0)<br></br> animate(10) do |anim|<br></br> nofill<br></br> clear do<br></br> oval(hor - radius, vert - radius, radius * 2.0)<br></br> satellites = vert / 10<br></br> satellites.to_i.times {|x|<br></br> h = hor + Math::sin(((6.28 / satellites) * x )) * 40.0<br></br> v = vert - Math::cos(((6.28 / satellites) * x )) * 40.0<br></br> fill rgb(1.0 / satellites, 1.0 / satellites, 0.8)<br></br> oval(h, v, 5.0)<br></br> }<br></br> skew vert / 10 * Math::cos(anim)<br></br> end<br></br> end<br></br> motion do |x, y|<br></br> hor, vert = x, y<br></br> end<br></br>end
借助它的动画及图形功能,像课件设计及可视化这样的图形应用变得简单了。这并不令人惊讶,因为 Ruby Shoes 本身源于 Hackety 项目,其初衷就是为编程新手降低编程的门槛。
另一方面,通过示例,我们还可以看到它使用了Web 的理念。Ruby Shoes 引入了URL和链接,使得界面行为的实现更为简易,而且,在图形界面中,设置和处理链接同样简单。下面的示例是一个简单的类 / 对象浏览器,用一个可分页的列表展示所有已加载的类,每个类都是一个链接,点击链接,会显示该类的所有实例。
1 module Util<br></br>2 def self.find_objects(name, from=0, to=10)<br></br>3 objects = []<br></br>4 c = 0<br></br>5 # get the class object from its name string<br></br>6 name_const = eval(name)<br></br>7 ObjectSpace::each_object( name_const ){|x|<br></br>8 if c >= from<br></br>9 objects << x<br></br>10 end<br></br>11 break if c >= to<br></br>12 c += 1<br></br>13 }<br></br>14 objects.sort{|first, second| first.to_s <=> second.to_s }<br></br>15 end<br></br>16 end<br></br>17 class ClassList < Shoes<br></br>18 url '/', :index<br></br>19 url '/objects/(\d+)', :object<br></br>20 url '/next', :next_page<br></br>21 url '/prev', :prev_page<br></br>22 def index<br></br>23 @@from = 0<br></br>24 object(0)<br></br>25 end<br></br>26 def next_page<br></br>27 @@from += 10<br></br>28 object(@@from)<br></br>29 end<br></br>30 def prev_page<br></br>31 @@from -= 10<br></br>32 object(@@from)<br></br>33 end<br></br>34 def object(num)<br></br>35 @@from ||= 0<br></br>36 num = num.to_i<br></br>37 stack :width => 500 do<br></br>38 flow :width => 200, :margin => 10, :margin_left => 200, :margin_top => 20 do<br></br>39 obj = Util::find_objects(@@objects[num].to_s)<br></br>40 text "#{obj.size}:" + obj.join(',')<br></br>41 end<br></br>42 flow :width => 380, :margin_left => 10 do<br></br>43 @@links = text ""<br></br>44 links = ""<br></br>45 if @@from >= 10<br></br>46 links += "<a href='/prev'>prev</a>\n"<br></br>47 end<br></br>48 @@objects[@@from, @@from+10].each_with_index{|el, idx|<br></br>49 links += "<span> <a href='/objects/#{@@from + idx}'>#{el}</a></span>"<br></br>50 }<br></br>51 links += "<a href='/next'> next</a>"<br></br>52 @@links.replace links<br></br>53 end<br></br>54 end<br></br>55 end<br></br>56 end<br></br>57 @@objects = Util::find_objects("Class", 0, 200)<br></br>58 Shoes.app :width => 640, :height => 700, :title => "Classes"
上述代码显示了 Ruby Shoes 中的一些理念:
- 给 URL 模式赋予处理函数的 URL路由功能
18 到 21 行展示了 URL 是如何映射到处理方法的。很容易看出来,应用的根是对应到index
方法的。同理,objects 目录下的所有地址匀对应到object
方法,而斜线符号后的所有信息都作为参数传给处理函数。这种处理事件的方式要比另一种界面交互方式——发布 / 订阅模式——简单多了。 flow
和stack
等布局方法
综上所述,哪怕只是因为它那些不同于其他 GUI 的理念,Ruby Shoes 也是绝对值得一试的。但是,如其作者所言,目前项目还处于开发阶段,将其投入实际使用还为时尚早,因为目前有些理念仍存变数。另外,目前文档的缺乏,也是阻挠其推广的一大因素。
尽管如此,Ruby Shoes 的动画及图形功能使搭建快速应用原型极为容易。关于 Ruby Shoes 的更多信息请参考 RubyInside 提供的 Ruby Shoes 资源列表,或者求助一下攻略,使用简单 GUI 组件上手或者从 2D 功能上上手。
查看英文原文: Ruby Shoes for lightweight GUIs, graphics and animation - - - - - -
译者简介:苏宇,网名 beanworms,软件工程师,开源项目 XRuby 成员。爱好广泛,尤喜烹饪。乐于寻找更好的解决问题的方法,目前对 Ruby 技术颇为着迷,个人 blog 为: http://azure-sky.javaeye.com/ 。参与 InfoQ 中文站内容建设,请邮件至 china-editorial[at]infoq.com 。
评论