3 Stimmen

ruby glade/gtkbuilder Beispiel?

Ich habe Ruby und Glade2 verwendet, um die Benutzeroberfläche für eine Weile zu entwerfen. In der neuen Version von Glade3 kann ich das Gtkbuilder-Format verwenden, um eine XML-Datei anstelle von Libglade zu erzeugen.

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

6voto

andreadallera Punkte 61

Es ist wirklich einfach: Erstellen Sie einfach Ihre GUI mit Glade (und speichern Sie es als GtkBuilder) und verwenden Sie es dann in Ruby 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 erzeugt das Builder-Objekt, das für die Erstellung der Glib::Objects aus Ihrer Xml-Definition und speichert sie auch zur späteren Verwendung (Sie können die get_object(objname) auf builder, wird das Widget zurückgegeben, das mit objname ).

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

Die dritte Zeile ist etwas undeutlicher. connect_signals ruft den bereitgestellten Block einmal für jedes Signal auf, das Sie in Ihrer Schnittstelle definiert haben. handler ist nur eine Zeichenkette (der Name des Signals). Sie sollen einen proc zurückgeben (oder irgendetwas, das mit call ) des Blocks: Dieser Block wird jedes Mal aufgerufen, wenn das Signal, das durch handler gefeuert wird. In diesem Beispiel gibt der Block lediglich eine Methode mit demselben Namen wie das Signal zurück (und der Einfachheit halber wird angenommen, dass es für jedes der in der Schnittstelle definierten Signale eine Methode gibt).

3voto

Jon Punkte 354

Sie haben Recht, dass es keine vorgefertigten Tutorials gibt, aber die Verwendung von gtkbuilder in Ruby ist fast identisch mit Python (gleiche Funktionsnamen, Aufrufreihenfolge), 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

3voto

Marc Quinton Punkte 31

Eine weitere Arbeitsversion, in objektorientierter 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

0voto

Vadim Peretokin Punkte 1706

Es ist eigentlich dasselbe. Hier ist ein gutes Beispiel: http://snippets.dzone.com/posts/show/5251 mit den richtigen Methoden zu ersetzen, und Sie sind bereit.

Es gibt eine in Ruby geschriebene IDE: http://github.com/danlucraft/redcar/tree/master aber ich war nicht in der Lage, seine Hauptdatei zu finden, um zu sehen, ob er Builder verwendet.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X