2009-06-19 5 views
2

Ich benutzte ruby ​​und glade2, um die Benutzeroberfläche für eine Weile in der neuen Version von glade3 zu entwerfen. Ich kann das gtkbuilder-Format verwenden, um eine XML-Datei anstelle von libglade zu erzeugen.ruby ​​licht/gtkbuilder beispiel?

Gibt es ein Beispiel? Ich suchte Google, aber ich hatte kein Glück!

Antwort

3

Sie haben Recht auf den Mangel an vorgeschriebenes Tutorials, aber die Verwendung von gtkbuilder in Ruby ist fast identisch mit Python (gleiche Funktionsnamen, Abrufaufträge), so dass diese von Interesse sein könnten -

GTK: : Builder-Modul: 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() 

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

0

Es ist der sa ich wirklich. Hier ist ein Beispiel für eine Lichtung: http://snippets.dzone.com/posts/show/5251 Ersetzen Sie mit den richtigen Methoden und Sie sind eingestellt.

Es gibt eine IDE in Ruby geschrieben: , aber ich war nicht in der Lage, seine Hauptdatei zu finden, um zu sehen, ob es Builder verwendet.

+0

Redcar ist oben auf JRuby/SWT umgesetzt, so überhaupt nicht GTK verwendet. – Jacob

+1

Das liegt daran, dass sie gewechselt haben. Zum Zeitpunkt des Schreibens meines Kommentars war es relevant. – Vadi

6

Es ist wirklich einfach: Ihre GUI mit Glade erstellen (und es als GtkBuilder speichern) und dann in Ruby verwenden mit:

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

die erste Zeile erstellt das Builder-Objekt, das die von der Erstellung verantwortlich ist Glib::Objects aus Ihrer XML-Definition und speichert sie auch für die spätere Verwendung (Sie können get_object(objname) auf Builder aufrufen, es wird das mit objname definierte Widget zurückgegeben).

Die zweite Zeile lädt tatsächlich Ihre Schnittstellendefinition, wobei file der Pfad zu Ihrer gtkbuilder-Datei ist.

Die dritte Zeile ist etwas unklarer. connect_signals ruft für jedes Signal, das Sie in Ihrer Schnittstelle definiert haben, den einmal angegebenen Baustein auf. handler ist nur eine Zeichenfolge (der Name des Signals). Sie sollen einen Proc (oder irgendetwas, das mit call aufrufbar ist) aus dem Block zurückgeben: Dieser Block wird jedes Mal aufgerufen, wenn das durch handler definierte Signal ausgelöst wird. In diesem Beispiel gibt der Block nur eine Methode mit dem gleichen Namen wie das Signal zurück (und es wird vereinfachend angenommen, dass es für jedes der in der Schnittstelle definierten Signale eine Methode gibt).

3

Eine weitere Arbeitsversion, in der objektorientierten Form:

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