首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ruby glade/gtkbuilder示例?

ruby glade/gtkbuilder示例?
EN

Stack Overflow用户
提问于 2009-06-19 13:14:51
回答 4查看 6K关注 0票数 3

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

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

EN

回答 4

Stack Overflow用户

发布于 2009-09-24 07:00:34

这真的很简单:只需使用Glade创建图形用户界面(并将其保存为GtkBuilder),然后在ruby中使用它:

代码语言:javascript
运行
复制
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),它将返回用objname定义的小部件)。

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

第三行比较晦涩难懂。对于您在接口中定义的每个信号,connect_signals都会调用一次提供的块。handler只是一个字符串(信号的名称)。您应该从该块返回一个proc (或任何可用call调用的内容):该块将在每次触发handler定义的信号时被调用。在本例中,该块只是返回一个与信号同名的方法(为了简单起见,假设接口中定义的每个信号都有一个方法)。

票数 6
EN

Stack Overflow用户

发布于 2009-06-19 13:42:16

你说的对,没有预先编写的教程,但在Ruby中gtkbuilder的用法几乎与Python相同(相同的函数名,调用顺序),所以这些可能会很有趣-

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

Python代码:

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2012-11-29 23:08:21

另一个工作版本,以面向对象的形式:

代码语言:javascript
运行
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1017908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档