直播预约通道开启!2021腾讯数字生态大会邀您共探产业发展新机遇! 了解详情
写点什么

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

2007 年 9 月 20 日

人们总是在不断在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 年 9 月 20 日 03:306272

评论

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

Elasticsearch 查询结果排序

escray

elastic 七日更 28天写作 死磕Elasticsearch 60天通过Elastic认证考试 2月春节不断更

简单的网站搭建

很甜回忆

网站

【管理笔记12】行销

俊毅

28天写作

专治小学生作业拖沓

Ian哥

28天写作

感性赢了理性那一面——浅谈峰终定律

Justin

心理学 28天写作

Kalm——基于Kubernetes的部署工具

David

开源 Kubernetes DevOps 运维 运维平台

高手来啦!十八般武艺保护你的Web应用

浪潮云

云计算

Linux入门篇 —— Shell详解

若尘

Linux 命令行 linux操作

javascript中的内置对象和数据结构

程序那些事

JavaScript 数据结构 ES6 程序那些事

【2021海量真实校招】软件测试面试真题,(大数据整理)刷完应对各家企业面试完全没有问题!

程序员阿沐

软件测试 面试题 自动化测试 黑盒测试 白盒测试

移除数组中的数字,不用额外空间, 实战RxSwift中的Observable, subscribe, dispose, 吴军老师态度读后感 John 易筋 ARTS 打卡 Week 39

John(易筋)

ARTS 打卡计划 吴军的态度 态度读后感

工作多年,如何找到自己更好的职业方向

一笑

28天写作

腾讯位置服务开发应用

魔王哪吒

28天写作 2月春节不断更 腾讯地图 腾讯位置服务开发应用 腾讯位置

【LeetCode】转置矩阵Java题解

HQ数字卡

算法 LeetCode 28天写作 2月春节不断更

谁手握账本?趣讲 ZK 的内存模型

HelloGitHub

Java zookeeper ZooKeeper原理

【计算机内功修炼】十:线程间到底共享了哪些进程资源

码农的荒岛求生

c c++ 线程 操作系统 进程

为什么要学习办公自动化

IT蜗壳-Tango

七日更 28天写作 2月春节不断更 IT蜗壳

火山翻译:工业级应用与研究

DataFunTalk

28天瞎写的第二百四十三天:正念冥想可以解决什么问题?

树上

冥想 28天写作 正念

翻译:《实用的Python编程》02_05_Collections

codists

Python

厘清 I/O 模型

sakila

网络编程 I/O

Kafka.07 - 性能优化介绍

insight

kafka 2月春节不断更

解读云原生技术

xcbeyond

Kubernetes 云原生 服务网格 28天写作

科大讯飞发布全新一代智能办公本X2

Lucien

优雅编程 | javascript代码优化的4个小技巧

devpoint

递归 命名空间 闭包 函数绑定

伊卡洛斯象征了什么?「Day 5」

道伟

文化 28天写作

如何有效改变别人的认知和行为?

数列科技杨德华

28天写作

阿里粗排技术体系与最新进展

DataFunTalk

为您收录的操作系统系列 - 进程管理(下篇)

Arvin

方法论 操作系统 进程

(28DW-S8-Day5) 区块链如何防伪

mtfelix

比特币 区块链 非对称加密 28天写作 防伪技术

别再这么写代码了,这几个方法不香吗?

楼下小黑哥

Java 重构

技术为帆,纵横四海- Lazada技术东南亚探索和成长之旅

技术为帆,纵横四海- Lazada技术东南亚探索和成长之旅

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