一个包装的实例

#!/usr/bin/env ruby

require 'gtk2'

# Make a new hbox filled with button-labels. Arguments for Gtk::HBox.new and 
# Gtk::Box#pack_start we are interested are passed in to this method.
def make_box(homogeneous, spacing, expand, fill, padding)
    box = Gtk::HBox.new(homogeneous, spacing)

    "Gtk::Box#pack_start (button, #{expand}, #{fill}, #{padding})".split(/ /).each do |s|
        button = Gtk::Button.new(s)
        box.pack_start(button, expand, fill, padding)
    end
    box
end

# Parse command line argument.
which = ARGV.shift
unless which
    $stderr.puts "usage: #{$0} num"
    $stderr.puts "    where num is 1, 2, or 3."
    exit 1
end

# Creates the main window.
window = Gtk::Window.new

# You should always remember to connect the delete_event signal
# to the main window. This is very important for proper intuitive
# behavior.
window.signal_connect("delete_event") do
    Gtk::main_quit
    false
end
window.border_width = 10

# We create a vertical box (vbox) to pack the horizontal boxes into (created by make_box).
# This allows us to stack the horizontal boxes filled with buttons one
# on top of the other in this vbox.
box1 = Gtk::VBox.new(false, 0)

case which.to_i
when 1
    # Creates and aligns a new label to the left side.  
    # We'll discuss this function and others in the section on Widget Attributes.
    label = Gtk::Label.new("Gtk::HBox.new(false, 0)")
    label.set_alignment(0, 0)
    box1.pack_start(label, false, false, 0)

    # The 2 first entries are for homegeneous and spacing parameters for Gtk::HBox.new.
    # The 3 last entries are for expand, fill and padding parameters for Gtk::HBox#pack_start.
    [
        [false, 0, false, false, 0],
        [false, 0, true,  false, 0],
        [false, 0, true,  true,  0],
    ].each do |args|
        # Create a horizontal box with the specified parameters 
        # and pack it on top of the vertical box.

        box2 = make_box(*args)
        box1.pack_start(box2, false, false, 0)
    end

    # Insert a separator in the vertical box.
    separator = Gtk::HSeparator.new
    box1.pack_start(separator, false, true, 5)

    # Same as previous.
    label = Gtk::Label.new("Gtk::HBox.new(true, 0)")
    label.set_alignment(0, 0)
    box1.pack_start(label, false, false, 0)
    [
        [true, 0, true, false, 0],
        [true, 0, true, true,  0],
    ].each do |args|
        box2 = make_box(*args)
        box1.pack_start(box2, false, false, 0)
    end

    separator = Gtk::HSeparator.new
    box1.pack_start(separator, false, true, 5)

when 2
    label = Gtk::Label.new("Gtk::HBox.new(false, 10)")
    label.set_alignment(0, 0)
    box1.pack_start(label, false, false, 0)

    [
        [false, 10, true, false, 0],
        [false, 10, true, true,  0],
    ].each do |args|
        box2 = make_box(*args)
        box1.pack_start(box2, false, false, 0)
    end

    separator = Gtk::HSeparator.new
    box1.pack_start(separator, false, true, 5)

    label = Gtk::Label.new("Gtk::HBox.new(false, 0)")
    label.set_alignment(0, 0)
    box1.pack_start(label, false, false, 0)

    [
        [false, 0, true, false, 10],
        [false, 0, true, true,  10],
    ].each do |args|
        box2 = make_box(*args)
        box1.pack_start(box2, false, false, 0)
    end

    separator = Gtk::HSeparator.new
    box1.pack_start(separator, false, true, 5)

when 3
    # This demonstrates the ability to use Gtk::Box#pack_end to
    # right justify widgets. First, we create a new box as before.
    box2 = make_box(false, 0, false, false, 0);

    # Create a label that will be put at the end.
    label = Gtk::Label.new("end")
    box2.pack_end(label, false, false, 0)
    box1.pack_start(box2, false, false, 0)

    # A separator for the bottom.
    separator = Gtk::HSeparator.new

    # This explicitly sets the separator to 400 pixels wide by 5 pixels
    # high. This is so the hbox we created will also be 400 pixels wide,
    # and the "end" label will be separated from the other labels in the
    # hbox. Otherwise, all the widgets in the hbox would be packed as
    # close together as possible. 
    separator.set_size_request(400, 5)
    box1.pack_start(separator, false, true, 5)
end

# Creates a new box, and packs a 'quit' button to it.
# This button can be used to terminate the program, exactly like the window
# close cross.
quitbox = Gtk::HBox.new(false, 0)
button = Gtk::Button.new("Quit")
button.signal_connect("clicked") do
    Gtk.main_quit
end 

quitbox.pack_start(button, true, false, 0)
box1.pack_start(quitbox, true, false, 0)
window.add(box1)

# Display all widgets.
window.show_all

# As usual, we finish by entering the main loop, with Gtk.main.
Gtk.main