7/22/2007

Ruby GUI

[begin edited2]
夠了,不要再修改了,後續請看 telnet://ptt.cc 的 Ruby 板或是:
http://godfat.tw/viewtopic.php?p=1779#1779
(我電腦關機或沒使用網路時連不上)
[end edited2]

[begin edited]

作者 godfat (godfat 真常) 看板 Ruby
標題 Re: [心得] GUI
時間 Sun Jul 22 18:13:32 2007
───────────────────────────────────────

說是這樣說,不過真正開始測試的時候,我發覺﹍

1. wxRuby
實在有點難用﹍有一堆不該有的參數要傳來傳去﹍放棄

2. FXRuby
mac 上其實是可以用啦﹍只是需要 X11, 不能用 Aqua
結果就是﹍對 user 來說很難用,放棄

3. QtRuby
結果還是得回到 QtRuby...
cmake .
make
sudo make install

測試了一下,正常可用 Qt4
不過市面上的文件好像以 Qt3 為多就是了

嘖,沒有 port install qtruby 真的很可惜
這樣以後要升級或是反安裝就比較麻煩了
不知道當初安裝的 source 是不是要留下來以便反安裝作業

--
--
※ 發信站: 批踢踢實業坊(ptt.cc)

[end edited]

關於 computer science 這個領域,除了程式語言(programming language)與物件導向(object-oriented)外,再下一個興趣大概就是使用者圖形介面了吧(GUI). 所以我一直想找個自己喜歡的 toolkit 來用,在 C++ 中無非就是 Qt4 了,不過在 Ruby 中,似乎沒有一個比較完美的 solution, 一個個來看。

在這之前,我先說明一下我用過的 C/C++/Java GUI toolkit.

1. MFC, 學校在教如何剪貼 MFC code, 我是叛逆份子,所以一個字都沒聽進去。不用別人說很糟,光看第一眼就覺得很糟,更何況他又是被罵得半死的東西。

2. wxWidgets, 這算是我第一個使用的 GUI toolkit, 基本上,我認為這真的是個很強大的東西,沒話說。不過最令人嘖嘖稱奇的應該是他跨平台的能力,如果我沒記錯的話,他跨的平台好像比 Java 還多!不過因為風格問題,我不是很喜歡。基本上,我認為 wxWidgets 的風格有些過於老舊,寫起來感覺不是很好。Ruby binding 叫 wxRuby.

3. Qt, 我想正是因為 wxWidgets 跟我不太合,所以才繼續找下去。不料找到 Qt4, 我認為這應該是接近完美的 solution 了。有人說,Qt 至少領先其他人十年,也許這麼講並不為過。最令人詬病的,大概就是你只能從 GPL 或超昂貴的商業 solution 兩種 license 中選一種。其實我不覺得這對我來說會是很大的困擾,open source 沒什麼不好,雖然 GPL 是有點太激進了些。Ruby binding 叫 QtRuby.

4. GTK+, 這個其實我不只沒用過,甚至連看都沒看過。理由很簡單,就是我不想用 C 想用 C++. 當然我知道 GTK+ 評價不錯,也有 Glade 和 win32 的 port, 只是似乎沒有足夠的推力讓我去嘗嘗看。

5. Swing, 會碰這個完全只是因為需要用 Java. 我個人是覺得他跟 wxWidgets 各有千秋,但同樣遠遜於 Qt. 不過也許這樣比較並不太公平,Java 天生就是沒 C++ 強。所以 Qt 遠勝可能是理所當然的?Ruby 要用可以使用 JRuby.

6. Ultimate++, 其實這個我沒用過,不過看起來是不錯。沒去試主要有三個原因,一,他綁 IDE, 這個我很不爽。二,他的命名法我不能接受。三,Qt 很好。XD 其實你去看他的網站,他有一個範例程式,並用各種 toolkit 來實做。我個人認為這個動作滿不誠懇的,他有故意挑其他人弱點的嫌疑。而且各 toolkit 做到的東西明顯有差異,這樣比並不公平。不誠懇,不喜歡。

7. Notus/VCF, 這兩樣 toolkit 都有一個很大的特色,就是 template template and template... 基本上用 C++ 當然是要用 template 啊!!不過知道這兩樣東西時我已經有一段時間沒碰 GUI 了,所以並沒有仔細調查這兩個 toolkit 感覺如何。但我想如果沒辦法接受 Qt 的話,這兩套 toolkit 值得一看。

8. .NET/mono, 這個其實我只用過 Visual C++ 2005 Express 稍微拉了一下介面,感覺還不錯,但直接寫起程式不知道是什麼感覺。Ruby 要用的話,或許可以試試 IronRuby, 不過我個人對 .NET 沒什麼好感,就不去試了。

9. VCL, Borland 的招牌,我用過 Turbo C++ Explorer, 感覺是﹍基本上我覺得沒有 .NET 好的感覺。而且要跨平台恐怕有點難,所以就不考慮了。更何況這些好像也不算 open source 的吧?

10. FOX, 這個是我最沒聽過的 toolkit, 是去找 Ruby GUI 時才發現他的存在,所以我一點都不知道他的狀況究竟如何。評價似乎是不錯,而且好像很年輕。只是呢﹍FXRuby 似乎沒有 mac 的 port, 而我也已經有點懶得用 C++ 寫 GUI 了,所以還是暫時跳過吧﹍。基本上沒有跨 win32/x11/aqua 三大系統的 toolkit, 我就沒什麼興趣試了。

本來只想隨意講一點的,不知不覺就扯多了。接下來看 Ruby 能使用的東西:

1. tk, 沒記錯的話,這個被 ruby 內建起來了。不過似乎是用過的都說爛,所以還是不要多考慮吧?

2. FXRuby, FOX 的 ruby binding, 評價相當不錯,唯一的缺點也許是還沒有 mac 版的樣子?我想未來應該值得繼續關切,雖然我還沒看過他程式寫起來像什麼樣子。要試用的話,除了需要安裝 FOX, FXRuby 就:gem install fxruby

3. wxRuby, wxWidgets 的 ruby binding, 我是看到有人批評寫起來像在寫 C++, 這應該算是一個滿大的缺點,不過看在他功能強大,跨平台能力驚人的份上,還是值得試試看吧。要試用的話,除了需要安裝 wxWidgets, wxRuby 就:gem install wxruby

4. QtRuby, Qt3 與 Qt4 的 ruby binding, 基本上評價仍然是相當地好,唯一的兩大缺點,第一個是沒有 gem, 不能 gem install qtruby, 第二個是在 windows 上要安裝似乎非常困難,沒有簡單的方法。但我相信假以時日,這兩個問題都能夠解決(嗚嗚)。

5. Swing, 要灌 JRuby, 我的 macports 似乎找不到 jruby, 我又不想從 sun 的網站抓下來灌,再說,我也沒喜歡過 swing 過,所以就懶得試了。

6. Mono, 我有灌 mono, 不過不是很清楚能不能用 IronRuby 之類的東西存取,之所以寫在這,算是做個筆記,說不定可以使用這樣。

7. GTK+, 我不是很確定有沒有 ruby binding, 但我想應該會有才是。不試的理由同上,所以也只是暫時筆記。

Ruby 的 GUI 比較有名的大概就這幾個了吧。其實我是一直想試 QtRuby 的,雖然 windows 上似乎不太容易使用,但相信假以時日一定可以的。而讓我卻步最大的問題點在於,不能用 gem 安裝,macports 也找不到 QtRuby. 也就是說,我得親自 ./configure make make install, 但我不喜歡這樣,管理不便。所以我決定還是暫時放下他,等他有 gem 或是 port 時再說吧!

FXRuby 因為沒用過 FOX, 所以也還是放著再說。更何況據說是沒有 mac 版,那我試屁啊﹍。所以左右思量之下,我還是決定先試 wxRuby! 安裝方便,強大的跨平台能力,雖然是 C++ style 而非 the ruby way, 但對我來說 C++ style 也不是那麼地令人排斥,也許有點詭異,但我覺得也可以用自己想要的方式重新 wrap 一次,對 ruby 來說那是如此簡單的事!

so have a try with wxRuby!

this is the hello world:

require 'rubygems'
require 'wx'

class HelloWorld < Wx::App
include Wx
def on_init
helloframe = Frame.new nil, -1, "Hello World"
StaticText.new helloframe, -1, "Hello World"
helloframe.show
end
end

HelloWorld.new.main_loop


sudo port install wxwidgets
sudo gem install wxruby

1 則留言:

匿名 提到...

它顯示

rubygems.rb:211:in `synchronize'
rubygems.rb:211:in `searcher'
rubygems/custom_require.rb:30:in `require'
rubygems.rb:477:in `ensure_gem_subdirectories'
rubygems.rb:474:in `each'
rubygems.rb:474:in `ensure_gem_subdirectories'
rubygems.rb:415:in `set_home'
rubygems.rb:138:in `dir'
rubygems.rb:424:in `set_paths'
rubygems.rb:161:in `path'
rubygems/source_index.rb:66:in `installed_spec_directories'
rubygems/source_index.rb:53:in `from_installed_gems'
rubygems.rb:126:in `source_index'
rubygems/custom_require.rb:105:in `init_gemspecs'
rubygems/custom_require.rb:54:in `initialize'
rubygems.rb:212:in `new'
rubygems.rb:212:in `searcher'
rubygems.rb:211:in `synchronize'
rubygems.rb:211:in `searcher'
rubygems/custom_require.rb:30:in `require'
hello_world.rb:2