【问题标题】:ruby glade/gtkbuilder example?红宝石林间空地/gtkbuilder 的例子?
【发布时间】:2009-06-19 13:14:50
【问题描述】:

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

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

【问题讨论】:

    标签: ruby gtk glade gtkbuilder


    【解决方案1】:

    这真的很简单:只需使用 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 并存储它们以供以后使用(您可以在 builder 上调用 get_object(objname),它将返回用 @987654324 定义的小部件@)。

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

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

    【讨论】:

      【解决方案2】:

      您说得对,缺少预先编写的教程,但 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

      【讨论】:

        【解决方案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
        

        【讨论】:

          【解决方案4】:

          其实是一样的。这是一个林间空地的例子:http://snippets.dzone.com/posts/show/5251 用正确的方法替换就可以了。

          有一个用 Ruby 编写的 IDE:http://github.com/danlucraft/redcar/tree/master,但我无法找到它的主文件以查看它是否使用 builder。

          【讨论】:

          • Redcar 是在 JRuby/SWT 之上实现的,因此与 GTK 完全无关。
          • 那是因为他们切换了。在撰写我的评论时,它是相关的。
          猜你喜欢
          • 2023-04-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多