2009-06-19 2 views
2

glade3の新しいバージョンでrubyとglade2を使ってしばらくユーザーインターフェースを設計していましたが、libgladeの代わりにgtkbuilder形式を使ってxmlファイルを生成することができます。ruby​​ glade/gtkbuilderの例ですか?

例はありますか?私はGoogleを検索しましたが、私は運がなかった!

答えて

3

あなたは右の前の書かれたチュートリアルの欠如にしているが、Rubyでgtkbuilderの使用は、Pythonとほとんど同じである(同じ関数名、コールオーダー)ので、これらに関心があるかもしれない -

GTK: :ビルダーモジュール:http://ruby-gnome2.sourceforge.jp/hiki.cgi?Gtk%3A%3ABuilder

Pythonコード:

import sys 
import gtk 

class TutorialTextEditor: 

    def on_window_destroy(self, widget, data=None): 
     gtk.main_quit() 

    def __init__(self): 

     builder = gtk.Builder() 
     builder.add_from_file("tutorial.xml") 

     self.window = builder.get_object("window") 
     builder.connect_signals(self)  

if __name__ == "__main__": 
    editor = TutorialTextEditor() 
    editor.window.show() 
    gtk.main() 

が出典:http://www.micahcarrick.com/01-01-2008/gtk-glade-tutorial-part-3.html

0

それはsaです私は本当に。ここには隙間の例があります:http://snippets.dzone.com/posts/show/5251は適切な方法で代用してください。

Rubyで書かれたIDEはhttp://github.com/danlucraft/redcar/tree/masterですが、ビルダーを使用しているかどうかを確認するためのメインファイルは見つかりませんでした。

+0

Redcarのはそうではない全くGTKが関連する、のJRuby/SWTの上に実装されています。 – Jacob

+1

それは彼らが切り替えたからです。私のコメントを書いている時点で、それは関係していた。 – Vadi

6

それは本当に簡単です:最初の行は、作成の責任者である、ビルダーオブジェクトを作成し

require 'rubygems' 
require 'gtk2' 
# require 'libglade2' #you don't need this anymore 

builder = Gtk::Builder.new 
builder.add_from_file(file) 
builder.connect_signals {|handler| method(handler) } 

:ちょうどグレイドを使用してGUIを作成する(とGtkBuilderとして保存)し、その後にRubyでそれを使用しますGlib::Objectsをxml定義から削除し、後で使用するためにそれらを保存します(get_object(objname)をビルダーに呼び出すと、objnameで定義されたウィジェットが返されます)。

実際には2番目の行にインターフェイス定義がロードされます。ここで、fileはgtkbuilderファイルへのパスです。

3行目はやや曖昧です。 connect_signalsは、インターフェイスで定義したすべての信号に対して1回提供されるブロックを呼び出します。 handlerは単なる文字列(シグナルの名前)です。ブロックからproc(またはcallで呼び出し可能なもの)を返すことになっています。handlerで定義されたシグナルが発生するたびにそのブロックが呼び出されます。この例では、ブロックは信号と同じ名前のメソッドを返すだけです(簡単にするため、インターフェイスに定義されているすべての信号に対してメソッドがあると仮定しています)。

3

別の作業バージョンは、オブジェクト指向形式で:

require 'gtk2' 

class Builder < Gtk::Builder 

def initialize xml 
     super() 

     self.add_from_string(xml) 

    self['main'].set_window_position Gtk::Window::POS_CENTER 
     self['main'].signal_connect('destroy') { Gtk.main_quit } 
     self['main'].show_all 

    self.connect_signals{ |handler| method(handler) } 

end 

def on_button_clicked w 

    case w.label 
      when 'quit' 
       Gtk::main_quit 
      else 
       puts "# on_button_clicked : " + w.label 

    end 
    end 

def on_main_destroy 
     puts "# on_main_destroy" 
     Gtk::main_quit 
    end 
end 

if __FILE__ == $0 

xml = <<EOI 
<?xml version="1.0" encoding="UTF-8"?> 
<interface> 
    <object class="GtkWindow" id="main"> 
    <property name="can_focus">False</property> 
    <child> 
     <object class="GtkButton" id="quit"> 
     <property name="label">quit</property> 
     <signal name="clicked" handler="on_button_clicked" swapped="no"/> 
     </object> 
    </child> 
    </object> 
</interface> 
EOI 


    Gtk.init 
     builder = Builder.new(xml) 
    Gtk.main 

end 
関連する問題