写点什么

Ruby Shoes:用户界面、图形及动画的轻量之选

  • 2007-09-20
  • 本文字数:2680 字

    阅读完需:约 9 分钟

人们总是在不断在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方法,而斜线符号后的所有信息都作为参数传给处理函数。这种处理事件的方式要比另一种界面交互方式——发布 / 订阅模式——简单多了。
  • flowstack等布局方法

综上所述,哪怕只是因为它那些不同于其他 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

2007-09-20 03:306742

评论

发布
暂无评论
发现更多内容

组织上线 | 资源共享,协作自如

Jianmu

Docker k8s 镜像 容器镜像

开源漏洞数量增长33%!企业安全债务不堪重负丨行业数据

SEAL安全

开源 开源安全 开源安全与治理

《工业和信息化领域数据安全管理办法(试行)》2023年正式执行

行云管家

数据安全

原力MetaForce2.0版本佛萨奇系统开发技术讲解方案

I8O28578624

有备无患!DBS高性价比方案助力富途证券备份上云

腾讯云数据库

数据库 腾讯云 备份 腾讯云数据库 富途证券

基于U-Net网络的图像分割的MindStudio实践

华为云开发者联盟

人工智能 华为云 12 月 PK 榜

华为云VPN,经典跟专业版企业应该怎么选?

爱尚科技

SeaTunnel 在天翼云数据集成平台的探索实践

Apache SeaTunnel

数据同步 数据集成平台

智能合约DAPP流动性质押挖矿分红系统开发说明及方案

I8O28578624

盘点Python 中字符串的常用操作

华为云开发者联盟

Python 开发 华为云 12 月 PK 榜

架构实战营模块3作业

程序员小张

「架构实战营」

华为云智能云接入ICA,助力企业轻松上云

与时俱进的时代

Wallys/QCA9531,MIMO,2.4G,30dBm,2 x 2.4G MMCX//AR9344 802.11a/802.11n 5G

wallysSK

一文解析Spring JDBC Template的使用指导

华为云开发者联盟

开发 华为云 12 月 PK 榜

啊哈!缓存

孟君的编程札记

redis 缓存 cache canal Guava

Vue + SpreadJS 实现高性能数据展示与分析

葡萄城技术团队

华为云智能云接入ICA,企业数据上云的信赖之选

与时俱进的时代

2022阅读总结

俞凡

阅读

用Echarts实现前端表格引用从属关系可视化

葡萄城技术团队

华为云全球加速GA:为您提供优质的网络服务

与时俱进的时代

安全可靠,弹性灵活--华为虚拟专用网络VPN

爱尚科技

华为云Classroom聚焦人才数字化转型,引领智慧教育改革新模式

华为云开发者联盟

开发 华为云 12 月 PK 榜

先进工具,助力数据科学工作者快速调优丨和鲸科技 × Weights & Biases

ModelWhale

人工智能 数据分析 模型训练 训练营 企业合作

【JVM规范】第一章 前言

四月

Java JVM

软件测试丨工具在接口测试中发挥什么样的作用?

测试人

软件测试 自动化测试 接口测试 测试开发

从各行业的实际运用中,窥见华为云虚拟专用网络VPN的强大性能

爱尚科技

SpreadJS集算表联动数据透视表,高效实现前端数据多维分析

葡萄城技术团队

Excel 财务审核系统 #web

企业数据安全解决方案-购买堡垒机!

行云管家

企业 数据安全 堡垒机

Wallys/QCA9531,MIMO,2.4G,30dBm,2 x 2.4G MMCX//AR9344 802.11a/802.11n 5G

wallysmeng

统一观测|如何使用 Prometheus 监控 Windows

阿里巴巴云原生

阿里云 云原生 Prometheus

国产数据库市场横空杀出个巨头?亚信 AntDB数据库凭什么

亚信AntDB数据库

数据库 AntDB 国产数据库 AntDB数据库

Ruby Shoes:用户界面、图形及动画的轻量之选_Ruby_Werner Schuster_InfoQ精选文章