3

私は ruby​​ と grade2 を使用してユーザー インターフェイスを設計していましたが、新しいバージョンの glade3 では、libglade の代わりに gtkbuilder 形式を使用して xml ファイルを生成できます。

例はありますか?私はグーグルで検索しましたが、運がありませんでした!

4

4 に答える 4

6

それは本当に簡単です: Glade で GUI を作成し (そしてそれを GtkBuilder として保存)、それを ruby​​ で次のように使用します:

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) }

最初の行は Builder オブジェクトを作成します。このオブジェクトは、Glib::Objectsxml 定義から を作成し、後で使用するために保存します (get_object(objname)ビルダーを呼び出すと、 で定義されたウィジェットが返されますobjname)。

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

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

于 2009-09-24T07:00:33.737 に答える
3

事前に作成されたチュートリアルがないことは確かですが、Ruby での gtkbuilder の使用法は Python とほぼ同じ (同じ関数名、呼び出し順序) であるため、これらは興味深いものになる可能性があります -

GTK::Builder モジュール: 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

于 2009-06-19T13:42:15.667 に答える
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
于 2012-11-29T15:08:20.627 に答える
0

本当に同じです。空き地の例を次に示します。http://snippets.dzone.com/posts/show/5251適切なメソッドに置き換えれば、設定は完了です。

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

于 2009-06-26T22:04:05.847 に答える