2009年5月5日 星期二

Ruby GUI 安裝奮戰記

寫 Ruby 有種麻醉的效果,所以最近常玩得醉醺醺地。

不過Win32 下頭的 Ruby安裝不知道該說是友善還是不友善,Ruby官網一抓就下來了,安裝也很直觀愉快,就是放在 C:\Ruby 下頭,打開命令列之後,下達以下指令:

cd\

cd\ruby

cd bin

ruby –v

就可以看見 Ruby 向你招手了。不過,紅寶石如果只有這樣,那就不好玩了,當我們上銀樓買寶石時,最費工的往往不是裸鑽,而是戒臺跟旁邊二二六六的,不過我是個沒耐性的人,很討厭各種奇怪的安裝或修正方式,特別是網路上一堆 ruby 版本頗舊,安裝起來修改不少,加上從以前苦命時代就留下來的同功能軟體不重複原則,所以我測試過許多的安裝方式,包括:

1.Ruby 官版 + Eclipse:RDT 對於命令提示確實如網路所寫,有些低能……

2.Ruby官版+Netbeans for WinXP SP3:還不錯,只是 rake 一直出現問題,錯誤訊息頗擾人,加上還內建強姦版 JRuby,懶得解決。而且要怎麼在 IDE 中加入 GTK 呢……?

3.Ruby 官版 + Netbeans for Ubuntu:安裝很順利完成。只是我不瞭,Ubuntu 為了安裝策略而沒有將 Ruby 打包,所以得手動安裝,這真是見鬼了。

4.Ruby 官版 + Netbeans for OSX:安裝很方便,照說只要 XCode 就可以了,怎麼搞的,非要包個 Cocoa 上去……為了相容專案,所以只好又裝個 Netbeans 上去。

5.Ruby官版 + Cygwin:別開玩笑了。再說一次,我很

6.Ruby官版 + EmEDIT:要這樣的話,那何必呢!

不過經過我這個懶人的到處亂找,還是找到不錯的工具了,現在列出安裝順序:

首先,先下載  Ruby in Steel。這是一套超級懶人包,會將所有的 Ruby on Rails 環境都幫你設定好。最妙的是,裡頭還包了一套 Visual Studio 2008 版本的 shell,因為我本來就使用 VS2008 寫 C# ,因此就選擇不裝了,讓它自己去設定就好。

如果你打算用其它環境,可以用懶人包王者 Ruby One Click 版本。其實上段講到的 Ruby in Steel,裡頭包的也是這個版本,因此,合理地,預設路徑就是:

C:\ruby

打開 Visual Studio 2008,第一個 Logo 就出現了紅寶石,開啟新專案,就可以看到了許多微妙的變化,包括下拉式選單有了 ruby 項目、多了一個 cmd 顯示視窗、工具也都設定好了。

其實這時候的 Ruby 已經可以使用了。再來是 GTK2,直接殺到 GTK2 官網去抓取,我很懶,所以直接使用推薦的 ruby-gnome2-0.16.0-1-i386-mswin32.exe, 然後將直譯器路徑設定好了之後,下達網頁建議的測試指令:

C:\ruby\>ruby -v

C:\ruby\>ruby -e "require 'gtk2'"

C:\ruby\>ruby -rgtk2 -e "Gtk::Window.new.show;Gtk.main"

wow,so nice,真是適合我這個懶人。然後是 Visual Studio的測試,先開一個 Ruby 專案檔,然後開始 key 程式碼:

require 'gtk2'

   window = Gtk::Window.new()

   button = Gtk::Button.new('Hello World')

                 window.add button

         button.show

         window.show

Gtk.main

GTK 視窗也很嗯哈哈地出現了。鬆一口氣。聽說 GTK2 帶的 Glade 可以使用 \ruby\bin\ 的 ruby-glade-create-template.bat 來轉換,等等來試試。

Glade 這玩意畫起來很不方便,如果用習慣 VS 或大部份的 GUI 工具的程設師可能一開始會搞不清楚狀況,其實我覺得設計的概念比較像以前 HTML 設計網頁時代的定位技巧,沒有 CSS 方便使用、加上瀏覽器各家胡搞的狀態,為了方便畫面元素定位就先畫表格,然後開始在表格中塞元素……

經過 ruby-glade-create-template 轉換的 .rb 檔案,大概會像下面這樣:

#!C:\ruby\bin

require 'gtk2'
require 'libglade2'

class F123Glade
      include GetText

  attr :glade
  def initialize(path_or_data, root = nil, domain = nil, localedir = nil, flag = GladeXML::FILE)
    bindtextdomain(domain, localedir, nil, "UTF-8")
    @glade = GladeXML.new(path_or_data, root, domain, localedir, flag) {|handler| method(handler)}
  end
  def on_open1_activate(widget)
    puts "on_open1_activate() is not implemented yet."
  end
  def on_paste1_activate(widget)
    puts "on_paste1_activate() is not implemented yet."
  end
  def on_save_as1_activate(widget)
    puts "on_save_as1_activate() is not implemented yet."
  end
  def on_about1_activate(widget)
    puts "on_about1_activate() is not implemented yet."
  end
  def on_copy1_activate(widget)
    puts "on_copy1_activate() is not implemented yet."
  end
  def on_new1_activate(widget)
    puts "on_new1_activate() is not implemented yet."
  end
  def on_delete1_activate(widget)
    puts "on_delete1_activate() is not implemented yet."
  end
  def on_cut1_activate(widget)
    puts "on_cut1_activate() is not implemented yet."
  end
  def on_save1_activate(widget)
    puts "on_save1_activate() is not implemented yet."
  end
  def on_quit1_activate(widget)
    puts "on_quit1_activate() is not implemented yet."
  end
end

# Main program
if __FILE__ == $0
  # Set values as your own application.
  PROG_PATH = "123.glade"
  PROG_NAME = "YOUR_APPLICATION_NAME"
  F123Glade.new(PROG_PATH, nil, PROG_NAME)
  Gtk.main
end

程式碼不難懂,紅色的部份是我自己修改的。要注意的是,ruby 對於變數名稱命名規則有些規定,而 ruby-glade-create-template 轉換時的 class 名稱是由檔名決定的,我很白目地取了一個 123.glade,結果就轉出一個 123Glade Class,當然下場就是,直譯出包。

感覺很高興。Visual Studio 中看到 GTK 感覺真的很奇妙,一定要用一句話來描述我的心情的話,我只想說:

GTK,你長得真醜。

沒有留言: