Пример ruby glade/gtkbuilder?
Я использовал ruby и glade2 для разработки пользовательского интерфейса некоторое время, в новой версии glade3 я могу использовать формат gtkbuilder для генерирования XML-файла вместо libglade.
есть ли пример? Я искал в Google, но мне не повезло!
4 ответа
Это действительно просто: просто создайте свой графический интерфейс с помощью 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
уволен. В этом примере блок просто возвращает метод с тем же именем, что и у сигнала (и для простоты предполагается, что для каждого из сигналов, определенных в интерфейсе, существует метод).
Еще одна рабочая версия, в объектно-ориентированной форме:
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
Вы правы в отсутствии предварительно написанных учебников, но использование 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
Это действительно так. Вот пример поляны: http://snippets.dzone.com/posts/show/5251 замените подходящими методами, и все готово.
Существует интегрированная среда разработки, написанная на Ruby: http://github.com/danlucraft/redcar/tree/master но мне не удалось найти ее основной файл, чтобы узнать, использует ли он компоновщик.