3

我在新版本的 glade3 中使用 ruby​​ 和 glade2 来设计用户界面一段时间,我可以使用 gtkbuilder 格式生成 xml 文件而不是 libglade。

有什么例子吗?我搜索了谷歌,但我没有运气!

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::Objects从您的 xml 定义中创建并存储它们以供以后使用(您可以调用get_object(objname)builder,它将返回用 定义的小部件objname)。

第二行实际上加载了您的接口定义,其中file是您的 gtkbuilder 文件的路径。

第三行有点模糊。connect_signals为您在接口中定义的每个信号调用一次提供的块。handler只是一个字符串(信号的名称)。您应该从块中返回一个过程(或任何可调用的):每次触发call定义的信号时都会调用该块。handler在此示例中,该块仅返回一个与信号同名的方法(并且,为简单起见,假设接口中定义的每个信号都有一个方法)。

于 2009-09-24T07:00:33.737 回答
3

You're right on the lack of pre-written tutorials, but the usage of gtkbuilder in Ruby is almost identical to Python (same function names, call orders) so these might be of interest -

GTK::Builder module: http://ruby-gnome2.sourceforge.jp/hiki.cgi?Gtk%3A%3ABuilder

Python code:

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

Source: 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 回答