如何实现Ruby Gnome作为GUI库

开发 开发工具
Ruby Gnome可以帮助我们实现GUI库的一些应用,并能解决一些GUI库无法解决的相关问题。希望大家可以通过这篇文章学到更多的知识。

Ruby 是一个灵活易用的完全面向对象的语言。它的优秀特性完全可以帮助我们解决GUI库无法解决的难题。下面就向大家详细介绍有关Ruby Gnome作为GUI库的应用方法。#t#

最近手上的一个项目刚好需要做一个Windows平台的GUI程序,以前是用VB,虽然VB是Windows GUI的经典工具,能够快速进行GUI原型开发,但是一旦GUI元素多起来,且UI元素存在复杂关系,就很难维护....特别在后期,一旦需求有什么变化,再去调整UI,那个叫痛苦啊。因此就想用ruby试试,加上此次项目设计很多网络通讯方面的需求,因此更加坚定了使用ruby的决心。现在项目基本完工,再回过头看,以前用VB开发时碰到的种种问题在新项目中都被很好地解决了。特别地,体会到了Closure对于GUI编程的重要性。不管未来在的GUI编程领域ruby是否能成为主流,但是可以预见那种语言一定是具备Closure(或类似)功能的。(或者只是我的美好愿望?)

GUI库选型:
ruby发行包自带TK库,用于简单的程序还可以,但是一旦有复杂界面需求时就难以满足。目前比较成熟的GUI绑定库有RubyFox,wxRuby 和Ruby Gnome. 鉴于GTK用的人比较多,加上GTK在Windows上的Runtime也是比较稳定,GTK应用的代表GIMP看起来也比较漂亮,因此就选择了RubyGnome作为GUI库。

关于Ruby Gnome我也不多介绍,其项目主页上的文档和教程非常不错。
Ruby-Gnome项目的首页: http://ruby-gnome2.sourceforge.jp/

1. Closure 作为响应GUI消息事件

在MFC中,响应消息通常需要定义OnXXX()虚函数,而且需要在消息传递宏里面与某个消息挂上勾,然后在实现OnXXX()函数。
在VB中,IDE为你为某个控件的消息生成消息响应函数。
那么在Ruby Gnome里面,这么做:

  1. button = Gtk::Button.new("Button A")   
  2. button.signal_connect("clicked") do   
  3. # ... when button clicked ...   
  4. msgbox "Button clicked !"   
  5. end   
  6. button = Gtk::Button.new("Button A")  
  7. button.signal_connect("clicked") do  
  8. # ... when button clicked ...  
  9. msgbox "Button clicked !"  
  10. 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

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是很常用的一个工具。在Ruby Gnome中,Gtk::Window没有msgbox这个接口,下面的例子就是封装了一个易用的Msgbox类,并打开Gtk::Window类,增加msgbox函数,这样所有基于Gtk::Window的类都可以随时调用msgbox。

 

上面的例子来源于实际项目,为了使用方便做了很多封装,后面还有一段测试代码,所以有点长。如果你也用Ruby Gnome开发GUI,那么这个简易的Msgbox将会带来很多方便。

Ruby作为GUI编程语言现在还不会成为主流,但是其动态特性将有助于解决传统GUI编程中遇到的问题,而且随着GUI binding lib的成熟,稳定,Ruby,有望在又一个领域成为编程利器。

责任编辑:曹凯 来源: kuqin.com
相关推荐

2009-12-15 13:41:49

Ruby向对象发送消息

2009-12-14 16:00:32

Ruby操作Oracl

2009-12-14 11:12:55

Ruby运行

2009-12-15 14:09:39

Ruby创建可参数化类

2009-12-18 16:27:41

Ruby解析Json

2009-09-28 11:05:29

Ruby端口扫描

2023-10-10 11:18:42

Spring数据库

2009-12-18 17:29:02

Ruby创建XML

2009-12-18 15:06:10

Ruby常用库

2009-07-06 15:55:52

Servlet例子Ruby

2009-12-17 13:37:24

Ruby代码块

2022-02-11 14:12:34

Gnome屏幕共享共享屏幕

2015-10-10 11:00:05

RubyRails性能

2015-10-14 17:27:18

性能

2009-12-15 17:53:18

Ruby标准库

2022-06-02 09:14:14

GNOME源码编译Linux 发行版

2014-03-19 09:19:44

KDE应用GNOME

2022-02-28 12:57:09

GNOMEPlasma桌面

2023-02-14 13:32:55

2009-12-16 15:04:26

Ruby实现strea
点赞
收藏

51CTO技术栈公众号