2009-06-19 6 views
2

J'utilisais ruby ​​et glade2 pour concevoir l'interface utilisateur pendant un certain temps dans la nouvelle version de glade3. Je peux utiliser le format gtkbuilder pour générer un fichier xml au lieu de libglade.Exemple de ruby ​​glade/gtkbuilder?

Y at-il un exemple? J'ai cherché google mais je n'ai pas eu de chance!

Répondre

3

Vous avez raison sur le manque de tutoriels pré-écrit, mais l'utilisation de GtkBuilder en Ruby est presque identique à Python (noms même fonction, les commandes d'appel) de sorte que ces pourraient intéresser -

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

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

Source: http://www.micahcarrick.com/01-01-2008/gtk-glade-tutorial-part-3.html

0

Il est sa moi vraiment. Voici un exemple clair: http://snippets.dzone.com/posts/show/5251 substituez avec les bonnes méthodes et vous êtes prêt.

Il y a un IDE écrit en Ruby: http://github.com/danlucraft/redcar/tree/master mais je n'ai pas pu trouver son fichier principal pour commencer à voir s'il utilise builder.

+0

Redcar est mis en œuvre sur le dessus de JRuby/SWT, donc pas du tout GTK lié. – Jacob

+1

C'est parce qu'ils ont changé. Au moment d'écrire mon commentaire, c'était pertinent. – Vadi

6

Il est très simple: il suffit de créer votre interface avec Glade (et l'enregistrer comme GtkBuilder), puis l'utiliser en rubis avec:

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

la première ligne crée l'objet Builder, qui est responsable de la création de la Glib::Objects de votre définition de xml et les stocke également pour une utilisation ultérieure (vous pouvez appeler get_object(objname) sur le constructeur, il retournera le widget défini avec objname).

La deuxième ligne charge réellement votre définition d'interface, où file est le chemin d'accès à votre fichier gtkbuilder.

La troisième ligne est un peu plus obscure. connect_signals appelle le bloc fourni une fois pour chaque signal que vous avez défini dans votre interface. handler est juste une chaîne (le nom du signal). Vous êtes censé renvoyer un proc (ou quelque chose d'invocable avec call) du bloc: ce bloc sera invoqué chaque fois que le signal défini par handler est déclenché. Dans cet exemple, le bloc renvoie simplement une méthode portant le même nom que le signal (et, par souci de simplicité, il est supposé qu'il existe une méthode pour chacun des signaux définis dans l'interface).

3

Une autre version de travail, sous forme orientée objet:

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