如何實現(xiàn)Ruby Gnome作為GUI庫
Ruby 是一個靈活易用的完全面向?qū)ο蟮恼Z言。它的優(yōu)秀特性完全可以幫助我們解決GUI庫無法解決的難題。下面就向大家詳細介紹有關(guān)Ruby Gnome作為GUI庫的應(yīng)用方法。#t#
最近手上的一個項目剛好需要做一個Windows平臺的GUI程序,以前是用VB,雖然VB是Windows GUI的經(jīng)典工具,能夠快速進行GUI原型開發(fā),但是一旦GUI元素多起來,且UI元素存在復(fù)雜關(guān)系,就很難維護....特別在后期,一旦需求有什么變化,再去調(diào)整UI,那個叫痛苦啊。因此就想用ruby試試,加上此次項目設(shè)計很多網(wǎng)絡(luò)通訊方面的需求,因此更加堅定了使用ruby的決心?,F(xiàn)在項目基本完工,再回過頭看,以前用VB開發(fā)時碰到的種種問題在新項目中都被很好地解決了。特別地,體會到了Closure對于GUI編程的重要性。不管未來在的GUI編程領(lǐng)域ruby是否能成為主流,但是可以預(yù)見那種語言一定是具備Closure(或類似)功能的。(或者只是我的美好愿望?)
GUI庫選型:
ruby發(fā)行包自帶TK庫,用于簡單的程序還可以,但是一旦有復(fù)雜界面需求時就難以滿足。目前比較成熟的GUI綁定庫有RubyFox,wxRuby 和Ruby Gnome. 鑒于GTK用的人比較多,加上GTK在Windows上的Runtime也是比較穩(wěn)定,GTK應(yīng)用的代表GIMP看起來也比較漂亮,因此就選擇了RubyGnome作為GUI庫。
關(guān)于Ruby Gnome我也不多介紹,其項目主頁上的文檔和教程非常不錯。
Ruby-Gnome項目的首頁: http://ruby-gnome2.sourceforge.jp/
1. Closure 作為響應(yīng)GUI消息事件
在MFC中,響應(yīng)消息通常需要定義OnXXX()虛函數(shù),而且需要在消息傳遞宏里面與某個消息掛上勾,然后在實現(xiàn)OnXXX()函數(shù)。
在VB中,IDE為你為某個控件的消息生成消息響應(yīng)函數(shù)。
那么在Ruby Gnome里面,這么做:
- button = Gtk::Button.new("Button A")
- button.signal_connect("clicked") do
- # ... when button clicked ...
- msgbox "Button clicked !"
- end
- button = Gtk::Button.new("Button A")
- button.signal_connect("clicked") do
- # ... when button clicked ...
- msgbox "Button clicked !"
- end
在這一點上,MFC最為繁瑣不用說了。VB由IDE為你預(yù)先做了很多工作。ruby用代碼關(guān)聯(lián)“clicked”事件,用Closure作為消息響應(yīng),干凈利落。 表面上看,似乎ruby的方式也未必好很多,但是且慢,看下一個....
2. Closure 里面可以訪問當前上下文
GUI編程經(jīng)常面臨的一個頭痛的問題是,UI元件通常需要是全局的,至少是窗口類內(nèi)全局。例如,希望button被按下的時候改變label的內(nèi)容,那么就要求在響應(yīng)button事件的代碼內(nèi)要能夠訪問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使得代碼“內(nèi)聚”了,即相互關(guān)聯(lián)的元素的作用域可以被限定在一個很小的范圍,這樣對于代碼的維護和應(yīng)付變化都是具有非凡的意義。
3. 動態(tài)打開一個類的能力使得擴展基類的功能變得簡單
ruby能夠動態(tài)地打開一個類并往里面增加method的能力已經(jīng)不是什么新鮮事,對于這個特性也有很多爭議。但對于GUI編程來說,這確實是提供了很大的方便。
在GUI編程中,msgbox是很常用的一個工具。在Ruby Gnome中,Gtk::Window沒有msgbox這個接口,下面的例子就是封裝了一個易用的Msgbox類,并打開Gtk::Window類,增加msgbox函數(shù),這樣所有基于Gtk::Window的類都可以隨時調(diào)用msgbox。
上面的例子來源于實際項目,為了使用方便做了很多封裝,后面還有一段測試代碼,所以有點長。如果你也用Ruby Gnome開發(fā)GUI,那么這個簡易的Msgbox將會帶來很多方便。
Ruby作為GUI編程語言現(xiàn)在還不會成為主流,但是其動態(tài)特性將有助于解決傳統(tǒng)GUI編程中遇到的問題,而且隨著GUI binding lib的成熟,穩(wěn)定,Ruby,有望在又一個領(lǐng)域成為編程利器。