- 浏览: 204654 次
- 性别:
- 来自: Wgt
最新评论
-
pxiaozei:
楼主,你这样用,需要在SVN服务器上建Git服务器端么?
SVN+GIT=鱼与熊掌兼得 -
southwolf:
这个项目还在维护吗……
OpenCV+Ruby构建图像处理研究平台 -
w87848608:
请问,比如我利用git,开了一个branch A,做了功能A, ...
SVN+GIT=鱼与熊掌兼得 -
sxlkk:
callmechen 写道本质上还是没有解决合并的繁琐。换汤不 ...
SVN+GIT=鱼与熊掌兼得 -
清气上升:
本地提交,本地错误恢复,eclipse有local histo ...
SVN+GIT=鱼与熊掌兼得
ruby语言由于其灵活优雅的表达方式和优秀的OO的特性,是GUI编程语言的有力竞争者。特别是其Closure特性,能够使GUI编程时遇到的很多头痛的问题迎刃而解。
最近手上的一个项目刚好需要做一个Windows平台的GUI程序,以前是用VB,虽然VB是Windows GUI的经典工具,能够快速进行GUI原型开发,但是一旦GUI元素多起来,且UI元素存在复杂关系,就很难维护....特别在后期,一旦需求有什么变化,再去调整UI,那个叫痛苦啊。因此就想用ruby试试,加上此次项目设计很多网络通讯方面的需求,因此更加坚定了使用ruby的决心。现在项目基本完工,再回过头看,以前用VB开发时碰到的种种问题在新项目中都被很好地解决了。特别地,体会到了Closure对于GUI编程的重要性。不管未来在的GUI编程领域ruby是否能成为主流,但是可以预见那种语言一定是具备Closure(或类似)功能的。(或者只是我的美好愿望?)
GUI库选型:
ruby发行包自带TK库,用于简单的程序还可以,但是一旦有复杂界面需求时就难以满足。目前比较成熟的GUI绑定库有RubyFox,wxRuby 和 RubyGnome. 鉴于GTK用的人比较多,加上GTK在Windows上的Runtime也是比较稳定,GTK应用的代表GIMP看起来也比较漂亮,因此就选择了RubyGnome作为GUI库。
关于RubyGnome我也不多介绍,其项目主页上的文档和教程非常不错。
Ruby-Gnome项目的首页: http://ruby-gnome2.sourceforge.jp/
1. Closure 作为响应GUI消息事件
在MFC中,响应消息通常需要定义OnXXX()虚函数,而且需要在消息传递宏里面与某个消息挂上勾,然后在实现OnXXX()函数。
在VB中,IDE为你为某个控件的消息生成消息响应函数。
那么在Ruby-Gnome里面,这么做:
在这一点上,MFC最为繁琐不用说了。VB由IDE为你预先做了很多工作。ruby用代码关联“clicked”事件,用Closure作为消息响应,干净利落。
表面上看,似乎ruby的方式也未必好很多,但是且慢,看下一个....
2. Closure 里面可以访问当前上下文
GUI编程经常面临的一个头痛的问题是,UI元件通常需要是全局的,至少是窗口类内全局。例如,希望button被按下的时候改变label的内容,那么就要求在响应button事件的代码内要能够访问label。在MFC中,label被迫成为全局。在VB中,你不能控制。在界面元素很多的时候,这可能会成为一个问题--你不得不仔细地为每一个UI元件命名以防止名称冲突。
而在ruby中,由于Closure能够访问当前上下文,因此正好可以完美解决这个问题:
ruby的Closure使得代码“内聚”了,即相互关联的元素的作用域可以被限定在一个很小的范围,这样对于代码的维护和应付变化都是具有非凡的意义。
3. 动态打开一个类的能力使得扩展基类的功能变得简单
ruby能够动态地打开一个类并往里面增加method的能力已经不是什么新鲜事,对于这个特性也有很多争议。但对于GUI编程来说,这确实是提供了很大的方便。
在GUI编程中,msgbox是很常用的一个工具。在RubyGnome中,Gtk::Window没有msgbox这个接口,下面的例子就是封装了一个易用的Msgbox类,并打开Gtk::Window类,增加msgbox函数,这样所有基于Gtk::Window的类都可以随时调用msgbox:
上面的例子来源于实际项目,为了使用方便做了很多封装,后面还有一段测试代码,所以有点长。如果你也用RubyGnome开发GUI,那么这个简易的Msgbox将会带来很多方便
Ruby作为GUI编程语言现在还不会成为主流,但是其动态特性将有助于解决传统GUI编程中遇到的问题,而且随着GUI binding lib的成熟,稳定,Ruby,有望在又一个领域成为编程利器。
从binding水平来看,FxRuby做的算比较好的了,和Ruby/TK一样,都能很好地体现ruby way. 但是毕竟Fox的应用面没有GTK广,在一些需要深度定制界面的场合,或者国际化方面,GTK可能做得更好一些。另外,GTK的外观个人觉得比Fox好看。
在快速构建程序方面,FxRuby会有优势。
最近手上的一个项目刚好需要做一个Windows平台的GUI程序,以前是用VB,虽然VB是Windows GUI的经典工具,能够快速进行GUI原型开发,但是一旦GUI元素多起来,且UI元素存在复杂关系,就很难维护....特别在后期,一旦需求有什么变化,再去调整UI,那个叫痛苦啊。因此就想用ruby试试,加上此次项目设计很多网络通讯方面的需求,因此更加坚定了使用ruby的决心。现在项目基本完工,再回过头看,以前用VB开发时碰到的种种问题在新项目中都被很好地解决了。特别地,体会到了Closure对于GUI编程的重要性。不管未来在的GUI编程领域ruby是否能成为主流,但是可以预见那种语言一定是具备Closure(或类似)功能的。(或者只是我的美好愿望?)
GUI库选型:
ruby发行包自带TK库,用于简单的程序还可以,但是一旦有复杂界面需求时就难以满足。目前比较成熟的GUI绑定库有RubyFox,wxRuby 和 RubyGnome. 鉴于GTK用的人比较多,加上GTK在Windows上的Runtime也是比较稳定,GTK应用的代表GIMP看起来也比较漂亮,因此就选择了RubyGnome作为GUI库。
关于RubyGnome我也不多介绍,其项目主页上的文档和教程非常不错。
Ruby-Gnome项目的首页: http://ruby-gnome2.sourceforge.jp/
1. Closure 作为响应GUI消息事件
在MFC中,响应消息通常需要定义OnXXX()虚函数,而且需要在消息传递宏里面与某个消息挂上勾,然后在实现OnXXX()函数。
在VB中,IDE为你为某个控件的消息生成消息响应函数。
那么在Ruby-Gnome里面,这么做:
button = Gtk::Button.new("Button A") button.signal_connect("clicked") do # ... when button clicked ... msgbox "Button clicked !" end
在这一点上,MFC最为繁琐不用说了。VB由IDE为你预先做了很多工作。ruby用代码关联“clicked”事件,用Closure作为消息响应,干净利落。
表面上看,似乎ruby的方式也未必好很多,但是且慢,看下一个....
2. Closure 里面可以访问当前上下文
GUI编程经常面临的一个头痛的问题是,UI元件通常需要是全局的,至少是窗口类内全局。例如,希望button被按下的时候改变label的内容,那么就要求在响应button事件的代码内要能够访问label。在MFC中,label被迫成为全局。在VB中,你不能控制。在界面元素很多的时候,这可能会成为一个问题--你不得不仔细地为每一个UI元件命名以防止名称冲突。
而在ruby中,由于Closure能够访问当前上下文,因此正好可以完美解决这个问题:
button = Gtk::Button.new("Button A") label = Gtk::Label.new("Hello") button.signal_connect("clicked") do label.text += "click " end
ruby的Closure使得代码“内聚”了,即相互关联的元素的作用域可以被限定在一个很小的范围,这样对于代码的维护和应付变化都是具有非凡的意义。
3. 动态打开一个类的能力使得扩展基类的功能变得简单
ruby能够动态地打开一个类并往里面增加method的能力已经不是什么新鲜事,对于这个特性也有很多争议。但对于GUI编程来说,这确实是提供了很大的方便。
在GUI编程中,msgbox是很常用的一个工具。在RubyGnome中,Gtk::Window没有msgbox这个接口,下面的例子就是封装了一个易用的Msgbox类,并打开Gtk::Window类,增加msgbox函数,这样所有基于Gtk::Window的类都可以随时调用msgbox:
require 'gtk2' =begin Msgbox: an easy message box based on Gtk::MessageDialog usage: example 1: Msgbox.new("This is a simple message box !").show example 2: if Msgbox.new("Yes or No ?", :type => :QUESTION, :buttons => :YES_NO).show puts "Your answer is: 'yes'" else puts "Your answer is not 'yes'" end example 3: Msgbox.new("OK or cancel ?", :type => :QUESTION, :buttons => :OK_CANCEL) do puts "Your answer: ok" end example 4, from within Gtk::Window or subclass: msgbox "Hello" msgbox! "warning infomation !" msgbox_err "error !" msgbox? "answer the question ...", :buttons=>:YES_NO =end class Msgbox def initialize(text = nil, param = {}, &block) @param = {} @param[:block] ||= block if @param[:block] show(text, param) else set_params(text, param) end end def set_params(text = nil, param = {}) @param[:parent] ||= param[:parent] @param[:text] ||= text @param[:buttons] = case param[:buttons] when :CANCEL, :cancel, "CANCEL", "cancel" Gtk::MessageDialog::BUTTONS_CANCEL when :CLOSE, :close, "CLOSE", "close" Gtk::MessageDialog::BUTTONS_CLOSE when :OK,:ok, "OK", "ok" Gtk::MessageDialog::BUTTONS_OK when :OK_CANCEL,:ok_cancel, "OK_CANCEL", "ok_cancel" Gtk::MessageDialog::BUTTONS_OK_CANCEL when :YES_NO, :yes_no, "YES_NO", "yes_no" Gtk::MessageDialog::BUTTONS_YES_NO when :NONE, :none, "NONE", "none" Gtk::MessageDialog::BUTTONS_NONE else @param[:buttons] || Gtk::MessageDialog::BUTTONS_OK end @param[:flags] ||= Gtk::Dialog::MODAL @param[:title] ||= param[:title] @param[:type] = case param[:type] when :ERROR @param[:title] ||= "Error" Gtk::MessageDialog::ERROR when :INFO @param[:title] ||= "Information" Gtk::MessageDialog::INFO when :QUESTION @param[:title] ||= "Question" Gtk::MessageDialog::QUESTION when :WARNING @param[:title] ||= "Warning" Gtk::MessageDialog::WARNING else @param[:title] ||= "Information" @param[:type] || Gtk::MessageDialog::INFO end end def show(text = nil, param = {}, &block) set_params(text, param) dialog = Gtk::MessageDialog.new(@param[:parent], @param[:flags], @param[:type], @param[:buttons], @param[:text]) dialog.title = @param[:title] dialog.signal_connect('response') do |w, response| @response = case response when Gtk::Dialog::RESPONSE_ACCEPT, Gtk::Dialog::RESPONSE_OK, Gtk::Dialog::RESPONSE_APPLY, Gtk::Dialog::RESPONSE_YES true else false end dialog.destroy end if @param[:parent] x, y = @param[:parent].position w, h = @param[:parent].size dw, dh = dialog.size dialog.move x + (w - dw) / 2, y + (h - dh) / 2 end dialog.run @param[:block] ||= block block.call if @param[:block] && @response @response end end class Gtk::Window def msgbox(text = nil, param = {}, &block) param[:parent] ||= self param[:block] ||= block Msgbox.new(text, param).show end def msgbox!(text = nil, param = {}, &block) msgbox(text, param.merge!({:type=>:WARNING, :block=>block})) end def msgbox_err(text = nil, param = {}, &block) msgbox(text, param.merge!({:type=>:ERROR, :block=>block})) end def msgbox?(text = nil, param = {}, &block) msgbox(text, param.merge!({:type=>:QUESTION, :block=>block})) end end if $0 == __FILE__ class TestWin < Gtk::Window def initialize super("Message Box Test") box = Gtk::HButtonBox.new buts = [] ["Info", "Warn", "Error", "Question"].each do |t| buts << (but = Gtk::Button.new(t)) box.pack_start but end buts[0].signal_connect("clicked") do msgbox "Hello" end buts[1].signal_connect("clicked") do msgbox! "Hello !" end buts[2].signal_connect("clicked") do msgbox_err "Hello, Hello, Hello !!", :title=>"Error happens !" end buts[3].signal_connect("clicked") do if msgbox? "Hello ?", :buttons=>:YES_NO msgbox "you select 'YES'" else msgbox "you don't select 'YES'" end end signal_connect("delete-event") do Gtk.main_quit false end add(box) end end win = TestWin.new win.show_all GC.start Gtk.main end
上面的例子来源于实际项目,为了使用方便做了很多封装,后面还有一段测试代码,所以有点长。如果你也用RubyGnome开发GUI,那么这个简易的Msgbox将会带来很多方便
Ruby作为GUI编程语言现在还不会成为主流,但是其动态特性将有助于解决传统GUI编程中遇到的问题,而且随着GUI binding lib的成熟,稳定,Ruby,有望在又一个领域成为编程利器。
评论
4 楼
gakaki
2008-08-31
adobe air or flex?
fxruby 有本书来着
fxruby 有本书来着
3 楼
wxz125627771
2008-08-31
Gtk库在ruby 1.9.0下部能用了 。。怎么办?
2 楼
rubynroll
2008-08-15
g.zhen.ning 写道
FxRuby,这个怎么样?
从binding水平来看,FxRuby做的算比较好的了,和Ruby/TK一样,都能很好地体现ruby way. 但是毕竟Fox的应用面没有GTK广,在一些需要深度定制界面的场合,或者国际化方面,GTK可能做得更好一些。另外,GTK的外观个人觉得比Fox好看。
在快速构建程序方面,FxRuby会有优势。
1 楼
g.zhen.ning
2008-08-14
FxRuby,这个怎么样?
发表评论
-
vi tips
2010-07-20 11:37 0These tips are just memo for my ... -
Setup PPTP VPN on ubuntu 9.10
2009-12-20 19:27 1853Something should be done to set ... -
交叉编译完全解决方案
2009-09-18 09:55 3685[注:本文仅适用于嵌 ... -
OpenCV+Ruby构建图像处理研究平台
2009-09-12 15:31 3040OpenCV OpenCV是一个很流行 ... -
Maemo下跑RubyGnome2
2009-09-09 20:07 2270稍微捣鼓了一下,RubyGnome2顺利在Maemo模拟器上运 ... -
GtkSimpleLayout Inspector
2009-09-06 20:01 1650Inspector介绍 Inspector是GtkSimple ... -
300行代码你能做什么
2009-09-02 14:12 4256我也标题党一回:300行 ... -
FAT over NAND Flash
2009-04-27 21:03 10697引子 最近有一个项目需要在NAND FLASH裸片上建立文件 ... -
UFFS嵌入式NAND FLASH文件系统 FAQ(1)
2009-04-15 19:03 0自从UFFS项目放到SF上, 陆陆续续收到不少邮件询问有关的问 ... -
Tips: 为源代码树打一个干净的包
2009-04-02 13:19 1913为源代码树打一个干净的包 ------------- ... -
Linux tips: allow more than 4 serial ports
2009-02-12 12:58 3819搞嵌入式的经常要和串口通讯打交道,在开发的时候有可能同时使用十 ... -
交叉编译Ruby傻瓜指南
2009-02-05 11:35 2784最近看到有人在交叉编译ruby的时候似乎碰到了许多问题(htt ... -
优化Debian/Ubuntu下的ruby
2008-12-30 19:27 2093我们都知道Debian/Ubuntu通过apt-get安装的r ... -
Debian/Ubuntu Tips: find the right package
2008-12-12 17:35 1107Debian/ubuntu下经常碰到需要安装某个程序,却一时想 ... -
Ruby/GTK应用笔记(3):垃圾回收
2008-09-14 08:39 2610虽然垃圾回收应该属于RubyVM自动处理的事,但是一旦涉及到C ... -
Ruby/GTK应用笔记(2): Gdk::Pixbuf
2008-09-01 17:08 3741Gdk::Pixbuf是GTK库极为重 ... -
Ruby/GTK应用笔记(1): Gtk::Toolbar
2008-08-21 13:04 1971由于Gtk的Toolbar内部接口发生了一些变化,在使用Gtk ... -
Ruby/Rails: 不一样的'Web'应用(续)
2008-07-28 21:23 1300上一篇文章(http://www.itey ... -
Ruby/Rails: 不一样的'Web'应用
2008-07-26 15:45 1461我不是Web程序员,也从 ... -
一个有趣的问题: 如何获取引用名?
2008-07-24 17:26 1360我们知道, 对于 a = 100 这样的一条语句, a是一 ...
相关推荐
Ruby是一种常用于Web开发的解释型面向对象编程语言。 它还提供了许多脚本功能来处理纯文本和序列化文件,或管理系统任务。 它是简单,直接和可扩展的。 Ruby的功能 简单语法 普通的面向对象功能(例如,类,方法...
### Ruby编程语言简介 #### 一、Ruby语言的起源与发展 Ruby是一种简洁高效的面向对象脚本语言,由日本人松本行弘(Yukihiro Matsumoto)在20世纪90年代开发。作为一种相对年轻的编程语言,Ruby的设计理念融合了...
Ruby元编程是编程领域中一个深入且强大的主题,它允许程序员在运行时修改或创建代码,极大地提高了灵活性和代码的动态性。这本书“Ruby元编程第二版”专注于讲解Ruby语言的这一独特特性,旨在帮助开发者更好地理解和...
### 前端学 Ruby:熟悉 Ruby 语法 #### Ruby 是什么? Ruby 是一种动态的、面向对象的脚本语言,由日本人松本行弘在 1995 年设计并开发。作为一种解释型语言,Ruby 具有简单易懂、功能强大且灵活的特点。Ruby 在 ...
内容概要:本文是一份全面的Ruby编程教程,涵盖了从基础入门到高级特性的所有内容。文章首先介绍了Ruby语言的特点和优势,接着详细讲解了环境搭建、基本语法、面向对象编程等内容。随后,通过几个实用的项目案例(如...
Ruby元编程是Ruby编程语言中的一个重要特色,它指的是Ruby语言允许程序员在运行时对类、方法和变量等进行操作的能力。通过元编程,开发者可以编写出更加简洁、灵活和高效的代码。《Metaprogramming Ruby》这本书深入...
本书不仅涵盖了Ruby编程的基础知识,还深入探讨了高级主题,使得读者能够在实践过程中掌握Ruby的核心概念和技术。 ### 一、Ruby语言概述 #### 1.1 什么是Ruby Ruby是一种简洁、高效、面向对象的脚本语言,由日本人...
Ruby是一种常用于Web开发的解释型面向对象编程语言。 它还提供了许多脚本功能来处理纯文本和序列化文件,或管理系统任务。 它是简单,直接和可扩展的。 Ruby的功能 简单语法 普通的面向对象功能(例如,类,方法调用...
系统需求Ruby版本大于等于2.0.0。因为前后端通讯使用了websocket,所以需要使用支持websocket的浏览器。目前打开文件对话框只实现了windows版本,在Linux等使用会出错,以后会尝试在其他系统实现,除此之外对系统...
对于初学者,可以从以下几个方面入手学习Ruby: 1. 学习基础语法:了解变量、常量、运算符、控制结构(条件语句、循环)、函数、类和模块的使用。 2. 掌握面向对象:理解类和对象的关系,继承、封装和多态的概念。...
内容概要:全面掌握Ruby编程语言,轻松应对各种开发挑战! 适用人群:适合对编程感兴趣的初学者,以及希望快速入门Ruby语言的开发者。 使用场景及目标:通过幽默风趣的语言和生动的比喻,帮助读者理解并掌握Ruby编程...
根据提供的文件信息,本文将对《Ruby元编程》这一主题进行深入探讨,解析其核心概念、应用场景以及为何元编程在Ruby语言中具有重要的地位。 ### 一、Ruby元编程简介 #### 1.1 元编程定义 元编程是指编写能够生成或...
在Ruby编程语言中,元编程是一种强大的特性,它允许我们在运行时动态地创建、修改甚至执行代码。"tadp-2015c1-metaprogramacion-xunit-ruby"是一个关于元编程和XUnit测试框架在Ruby中的应用的练习项目。元编程在软件...
在Ruby中使用块:一份脑友好的报告(Jay McGavren)是一本专注于Ruby编程语言中块(block)概念的图书。Ruby块是一种类似闭包的结构,可以在Ruby的方法调用中传递代码块,以此来处理不同的任务。本书的目标是帮助...
Ruby元编程是编程的一种高级技巧,它允许程序员在运行时动态地修改或创建代码,极大地提高了灵活性和代码的可扩展性。Ruby作为一种动态类型语言,其元编程能力尤为强大,使得开发者可以创建出高度定制化的解决方案。...
【RubyGnome2库】是Ruby语言用于GTK+图形用户界面开发的重要工具,它为GTK+库提供了完整的Ruby封装,允许开发者用Ruby语言编写GUI应用程序。RubyGnome2保留了GTK+的API命名规则,使得熟悉GTK+的开发者能够轻松过渡到...
Ruby编程语言入门与实践 Ruby编程语言入门与实践 Ruby编程语言入门与实践 Ruby编程语言入门与实践 Ruby编程语言入门与实践 Ruby编程语言入门与实践 Ruby编程语言入门与实践 Ruby编程语言入门与实践 Ruby编程语言入门...
《Ruby编程,实用程序员指南》是一本针对Ruby语言的学习教程与参考手册,旨在为程序员提供一个全面、深入的Ruby语言学习资源。本书不仅适合初学者快速入门,也适合具有一定经验的开发者进阶学习。 ### 一、Ruby语言...