写点什么

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:306760

评论

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

教育机构这一大堆问题都是由教育管理系统解决的

低代码小观

公司管理 教育 企业管理 CRM 管理工具

理论+实例,带你掌握Linux的页目录和页表

华为云开发者联盟

Linux 内存管理 寄存器 页目录 页表

面试巨作!13万字!腾讯高工手写JDK源码笔记 带你飙向实战

收到请回复

Java jdk 面试 后端

马萨卡!阿里大佬珍之若宝的最强高并发pdf,竟然被上传GitHub开源

Java 架构 面试 编程语言

Java集合核心内容之葵花宝面,搞定90%以上的技术面!建议收藏

程序员小呆

Java 程序员 架构师

为什么网络 I/O 会被阻塞?

编程 架构 操作系统 计算机

程序员常用的工具软件推荐

程序员小呆

Java c++ 程序员 架构师 Go 语言

惊!HUAWEI高工熬夜赶出这本20W字的图解计算机操作系统指南手册,竟被我偶然发现!

Java 架构 面试 程序人生 编程语言

极客架构营2期模块5作业

Ping

这还不够全?阿里P8架构师耗时八年时间才整理出来这“Java核心知识PDF(Java高岗)

Java 程序员 架构 面试 后端

Zookeeper 集群部署的那些事儿

牧小农

zookeeper

从简历被拒到收割8个大厂offer,我用了3个月成功破茧成蝶

收到请回复

Java 程序员 面试

封神总结!蚂蚁金服+滴滴+美团+拼多多+腾讯15万字Java面试题

收到请回复

Java 程序员 面试 微服务 大厂Offer

从互联网“后来者”到“引领者”:这场IPv6大会上,我读懂了中国式创新

脑极体

【ShardingSphere技术专题】「ShardingJDBC」(1)带你一同认识一下ShardingJDBC是什么?(高手勿入)

洛神灬殇

ShardingJDBC ShardingSphere 算法学习笔记指南 10月月更

2022年最新Java小白学习路线总结,从零基础跟着学习不掉队(PDF+视频分享篇)

Java 编程 程序员 计算机 java面试

2021金九银十阿里Java岗7轮技术面经历,险幸上岸

Java 程序员 架构 面试 计算机

手把手带你做LiteOS的树莓派移植

华为云开发者联盟

树莓派 系统 LiteOS arm 树莓派移植

网络安全产品之堡垒机应用于金融行业案例讲解

行云管家

云计算 网络安全 等保 堡垒机

Android 资源溢出崩溃轻松解

字节跳动终端技术

字节跳动 移动开发 Mars 火山引擎 MARS-APMPlus

律所管理系统能解决律师事务所存在的这些问题

低代码小观

公司管理 企业 企业管理 管理工具 律所

和12岁小同志搞创客开发:如何驱动LED点阵模块?

不脱发的程序猿

少儿编程 创客开发 LED点阵模块

JS的深浅复制,原来如此!

华为云开发者联盟

js 序列化 深复制 浅复制

我凭借这份pdf拿下了蚂蚁金服、字节跳动、小米等大厂的offer

Java 编程 程序员 架构

相约 DTCC 2021 | Tapdata 受邀分享:如何打造面向 TP 业务的数据平台架构

tapdata

GitHub上首本IntelliJ IDEA操作手册,标星果然百万名不虚传

Java 架构 面试 程序人生 编程语言

阿里P8手抄本惨遭泄露,并出现病毒式传播,致28人斩获大厂offer

收到请回复

Java 面试 阿里 大厂Offer

深入思考软件工程,开启 DevOps 之旅

BoCloud博云

DevOps cicd 云原生 CI/CD 敏捷交付

汇纳科技数据科学团队研究商场活动效果并优化的论文被ISR期刊接收

Kubernetes 中的应用参数配置案例详析

Zilliz

数据库 Kuber k8s Helm

会声会影和剪映在音频处理功能上的比较

懒得勤快

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