пример ruby ​​glade / gtkbuilder? - PullRequest
2 голосов
/ 19 июня 2009

Я некоторое время использовал ruby ​​и glade2 для разработки пользовательского интерфейса. В новой версии glade3 я могу использовать формат gtkbuilder для создания XML-файла вместо libglade.

есть ли пример? Я искал в Google, но мне не повезло!

Ответы [ 4 ]

6 голосов
/ 24 сентября 2009

Это действительно просто: просто создайте свой графический интерфейс с Glade (и сохраните его как 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::Objects из вашего определения xml, а также сохраняет их для последующего использования (вы можете вызвать get_object(objname) на компоновщике, он вернет виджет, определенный с помощью objname).

Вторая строка фактически загружает определение вашего интерфейса, где file - это путь к вашему файлу gtkbuilder.

Третья строка несколько более неясна. connect_signals вызывает блок, предоставленный один раз для каждого сигнала, который вы определили в вашем интерфейсе. handler это просто строка (название сигнала). Предполагается, что вы должны вернуть proc (или что-либо, что можно вызвать с call) из блока: этот блок будет вызываться каждый раз, когда срабатывает сигнал, определенный handler. В этом примере блок просто возвращает метод с тем же именем, что и сигнал (и для простоты предполагается, что для каждого из сигналов, определенных в интерфейсе, существует метод).

3 голосов
/ 29 ноября 2012

Другая рабочая версия, в объектно-ориентированной форме:

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
3 голосов
/ 19 июня 2009

Вы правы по поводу отсутствия предварительно написанных учебников, но использование gtkbuilder в Ruby практически идентично 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

0 голосов
/ 27 июня 2009

То же самое на самом деле. Вот пример поляны: http://snippets.dzone.com/posts/show/5251 замените подходящими методами, и все готово.

Существует среда IDE, написанная на Ruby: http://github.com/danlucraft/redcar/tree/master, но я не смог найти ее основной файл, чтобы узнать, использует ли он компоновщик.

...