《R和Ruby数据分析之旅》一1.2 Shoes( 二 )


我在本书中选择Shoes作为用户界面开发工具的一个主要原因是,它可以相当简便地开发很好的图形界面 。因为它是纯Ruby的(与那些Ruby和其他工具的混合体相反),代码的可读性强,易于理解 。
一个简单的Shoes程序会像下面这样:
Shoes.app dobutton("Click me!") doalert("Ruby rocks!")endend
此程序生成一个简单的窗口,其中只有一个名为“Click me!”的按钮 。点击该按钮,会弹出一个警告对话框,如图1-1所示 。

《R和Ruby数据分析之旅》一1.2 Shoes

文章插图
尽管Shoes是一个简单的UI工具,但还是有很多特性,不可能用几节文字就介绍完整 。我只能提供一些基本的例子 。让我们从建立一个简单的秒表程序开始 。
1.Shoes秒表
在例1-1中,我会展示如何用Shoes建立一个非常简单的秒表 。
例1-1 Shoes秒表
Shoes.app height: 200, width: 200 dobackground lightbluestack margin: 10 docaption strong "Shoes Stopwatch"flow dobutton "start" do@time = Time.now@label.replace "Started at #{@time.strftime '%l:%M:%S %p'}"endbutton "stop" do@label.replace "Stopped, ", strong("#{Time.now - @time}")," seconds elapsed."endend@label = para "Press ", strong("start"), " to begin timing."endend
所有的Shoes应用代码都必须包含在一个对Shoes.app的调用中 。你可以随意设置起始窗口的外观 。本例中,我们设定了窗口的宽和高 。第二行7代码则设定了窗口的背景颜色 。这并不总是必需的,但注意(浅蓝色)是Shoes窗口的预设颜色 。Shoes 借鉴了X118和HTML9调色板定义的一系列默认颜色方案,并用直观的名字来代表它们 。如果你倾向于建立自己的自定义颜色方案,可以利用rgb方法 。
Shoes应用程序中的元素用槽(slot)来安排,它作为容器,可以盛载若干元素,或者其他槽 。槽还可以被嵌套,通过对槽和元素进行嵌套可以编制相当复杂的布局 。槽有两种常见类型,即栈(stack)和流(flow)
栈 。栈是按上下次序排放的一“摞”元素的集合 。例1-1所示的秒表程序将3个元素放入了栈中:一个说明文本块(block)、一个流槽和一个段落文本块 。
流 。流槽将元素按一个接一个的顺序排成一“队”,紧密衔接 。例1-1所示的秒表程序将两个按钮放到一个流中,一个标记为“start”(开始),一个标记为“stop”(结束) 。
你也可以为槽设置配置参数 。秒表例子中的栈就通过参数设置了10个像素宽的边距 。
(按钮)元素为应用程序生成一个按钮 。如果在元素中加入像例子中所示的代码块,当单击按钮时,就会执行其中的代码 。另一种设置按钮点击后行为的方法是使用click方法,稍后我们会讲到 。
执行先前的代码,你可以看到图1-2所示的秒表 。
《R和Ruby数据分析之旅》一1.2 Shoes

文章插图
这是个相当传统的用户界面,让我们来做点更有艺术含量的事情 。
2.Shoes涂鸦程序
我们来编写一个简单的涂鸦程序 。例1-2中的这个程序是个标准的演示程序,并没有多少使用价值,但阐明了Shoes的一些基本概念 。
例1-2 Shoes涂鸦程序
Shoes.app dofill redorig_left, orig_top = nil,nilanimate 24 dobutton, left, top = self.mouseline(orig_left, orig_top, left, top) if button == 1star(orig_left, orig_top, 5, 15, 5) if button ==3orig_left, orig_top = left, topendend
这个程序看上去比秒表程序还要简单 。让我们从描述方法入手来理解它 。这个方法启动一个动画计时器,与程序剩下的部分并行执行 。我们指定了当动画循环开始后每秒显示的帧数,所以程序会无限地循环下去 。你可能会想到,这对于模拟运行而言是一个完美的方法 。