我使用ruby和glade2在新版本的glade3中设计用户界面一段时间我可以使用gtkbuilder格式生成xml文件而不是libglade。
有什么例子吗?我搜索谷歌,但我没有运气!
答案 0 :(得分: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对象,该对象负责从xml定义创建Glib::Objects
并存储它们以供以后使用(您可以在构建器上调用get_object(objname)
,它将返回小部件用objname
)定义。
第二行实际上加载了您的接口定义,其中file
是gtkbuilder文件的路径。
第三行有点模糊。 connect_signals
为您在界面中定义的每个信号调用一次提供的块。 handler
只是一个字符串(信号的名称)。你应该从块中返回一个proc(或任何可以用call
调用的东西):每当handler
定义的信号被触发时,都会调用该块。在这个例子中,块只返回一个与信号同名的方法(为简单起见,假设有一个方法用于接口中定义的每个信号)。
答案 1 :(得分: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
答案 2 :(得分: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
答案 3 :(得分:0)
真的是一样的。这是一个林间空地的例子:http://snippets.dzone.com/posts/show/5251用适当的方法代替,你已经设定了。
有一个用Ruby编写的IDE:http://github.com/danlucraft/redcar/tree/master但是我无法找到它的主文件,看看它是否使用了构建器。