#!/usr/bin/env python # example packbox.py import gtk import sys, string # Helper function that makes a new hbox filled with button-labels. Arguments # for the variables we're interested are passed in to this function. We do # not show the box, but do show everything inside. def make_box(homogeneous, spacing, expand, fill, padding): # Create a new hbox with the appropriate homogeneous # and spacing settings box = gtk.HBox(homogeneous, spacing) # Create a series of buttons with the appropriate settings button = gtk.Button("box.pack") box.pack_start(button, expand, fill, padding) button.show() button = gtk.Button("(button,") box.pack_start(button, expand, fill, padding) button.show() # Create a button with the label depending on the value of # expand. if expand == gtk.TRUE: button = gtk.Button("TRUE,") else: button = gtk.Button("FALSE,") box.pack_start(button, expand, fill, padding) button.show() # This is the same as the button creation for "expand" # above, but uses the shorthand form. button = gtk.Button(("FALSE,", "TRUE,")[fill==gtk.TRUE]) box.pack_start(button, expand, fill, padding) button.show() padstr = "%d)" % padding button = gtk.Button(padstr) box.pack_start(button, expand, fill, padding) button.show() return box class PackBox1: def delete_event(self, widget, event, data=None): gtk.main_quit() return gtk.FALSE def __init__(self, which): # Create our window self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) # You should always remember to connect the delete_event signal # to the main window. This is very important for proper intuitive # behavior self.window.connect("delete_event", self.delete_event) self.window.set_border_width(10) # We create a vertical box (vbox) to pack the horizontal boxes into. # This allows us to stack the horizontal boxes filled with buttons one # on top of the other in this vbox. box1 = gtk.VBox(gtk.FALSE, 0) # which example to show. These correspond to the pictures above. if which == 1: # create a new label. label = gtk.Label("HBox(FALSE, 0)") # Align the label to the left side. We'll discuss this method # and others in the section on Widget Attributes. label.set_alignment(0, 0) # Pack the label into the vertical box (vbox box1). Remember that # widgets added to a vbox will be packed one on top of the other in # order. box1.pack_start(label, gtk.FALSE, gtk.FALSE, 0) # Show the label label.show() # Call our make box function - homogeneous = FALSE, spacing = 0, # expand = FALSE, fill = FALSE, padding = 0 label = gtk.Label("homogeneous = FALSE, spacing = 0, expand = FALSE, fill = FALSE, padding = 0") label.set_alignment(0, 0) box1.pack_start(label, gtk.FALSE, gtk.FALSE, 0) label.show() box2 = make_box(gtk.FALSE, 0, gtk.FALSE, gtk.FALSE, 0) box1.pack_start(box2, gtk.FALSE, gtk.FALSE, 0) box2.show() # Call our make box function - homogeneous = FALSE, spacing = 0, # expand = TRUE, fill = FALSE, padding = 0 label = gtk.Label("homogeneous = FALSE, spacing = 0, expand = TRUE, fill = FALSE, padding = 0") label.set_alignment(0, 0) box1.pack_start(label, gtk.FALSE, gtk.FALSE, 0) label.show() box2 = make_box(gtk.FALSE, 0, gtk.TRUE, gtk.FALSE, 0) box1.pack_start(box2, gtk.FALSE, gtk.FALSE, 0) box2.show() # Args are: homogeneous, spacing, expand, fill, padding label = gtk.Label("homogeneous = FALSE, spacing = 0, expand = TRUE, fill = TRUE, padding = 0") label.set_alignment(0, 0) box1.pack_start(label, gtk.FALSE, gtk.FALSE, 0) label.show() box2 = make_box(gtk.FALSE, 0, gtk.TRUE, gtk.TRUE, 0) box1.pack_start(box2, gtk.FALSE, gtk.FALSE, 0) box2.show() # Creates a separator, we'll learn more about these later, # but they are quite simple. separator = gtk.HSeparator() # Pack the separator into the vbox. Remember each of these # widgets is being packed into a vbox, so they'll be stacked # vertically. box1.pack_start(separator, gtk.FALSE, gtk.TRUE, 5) separator.show() # Create another new label, and show it. label = gtk.Label("HBox(TRUE, 0)") label.set_alignment(0, 0) box1.pack_start(label, gtk.FALSE, gtk.FALSE, 0) label.show() # Args are: homogeneous, spacing, expand, fill, padding label = gtk.Label("homogeneous = TRUE, spacing = 0, expand = TRUE, fill = FALSE, padding = 0") label.set_alignment(0, 0) box1.pack_start(label, gtk.FALSE, gtk.FALSE, 0) label.show() box2 = make_box(gtk.TRUE, 0, gtk.TRUE, gtk.FALSE, 0) box1.pack_start(box2, gtk.FALSE, gtk.FALSE, 0) box2.show() # Args are: homogeneous, spacing, expand, fill, padding label = gtk.Label("homogeneous = TRUE, spacing = 0, expand = TRUE, fill = TRUE, padding = 0") label.set_alignment(0, 0) box1.pack_start(label, gtk.FALSE, gtk.FALSE, 0) label.show() box2 = make_box(gtk.TRUE, 0, gtk.TRUE, gtk.TRUE, 0) box1.pack_start(box2, gtk.FALSE, gtk.FALSE, 0) box2.show() # Another new separator. separator = gtk.HSeparator() # The last 3 arguments to pack_start are: # expand, fill, padding. box1.pack_start(separator, gtk.FALSE, gtk.TRUE, 5) separator.show() elif which == 2: # Create a new label, remember box1 is a vbox as created # near the beginning of __init__() label = gtk.Label("HBox(FALSE, 10)") label.set_alignment( 0, 0) box1.pack_start(label, gtk.FALSE, gtk.FALSE, 0) label.show() # Args are: homogeneous, spacing, expand, fill, padding label = gtk.Label("homogeneous = FALSE, spacing = 10, expand = TRUE, fill = FALSE, padding = 0") label.set_alignment(0, 0) box1.pack_start(label, gtk.FALSE, gtk.FALSE, 0) label.show() box2 = make_box(gtk.FALSE, 10, gtk.TRUE, gtk.FALSE, 0) box1.pack_start(box2, gtk.FALSE, gtk.FALSE, 0) box2.show() # Args are: homogeneous, spacing, expand, fill, padding label = gtk.Label("homogeneous = FALSE, spacing = 10, expand = TRUE, fill = TRUE, padding = 0") label.set_alignment(0, 0) box1.pack_start(label, gtk.FALSE, gtk.FALSE, 0) label.show() box2 = make_box(gtk.FALSE, 10, gtk.TRUE, gtk.TRUE, 0) box1.pack_start(box2, gtk.FALSE, gtk.FALSE, 0) box2.show() separator = gtk.HSeparator() # The last 3 arguments to pack_start are: # expand, fill, padding. box1.pack_start(separator, gtk.FALSE, gtk.TRUE, 5) separator.show() label = gtk.Label("HBox(FALSE, 0)") label.set_alignment(0, 0) box1.pack_start(label, gtk.FALSE, gtk.FALSE, 0) label.show() # Args are: homogeneous, spacing, expand, fill, padding label = gtk.Label("homogeneous = FALSE, spacing = 0, expand = TRUE, fill = FALSE, padding = 10") label.set_alignment(0, 0) box1.pack_start(label, gtk.FALSE, gtk.FALSE, 0) label.show() box2 = make_box(gtk.FALSE, 0, gtk.TRUE, gtk.FALSE, 10) box1.pack_start(box2, gtk.FALSE, gtk.FALSE, 0) box2.show() # Args are: homogeneous, spacing, expand, fill, padding label = gtk.Label("homogeneous = FALSE, spacing = 0, expand = TRUE, fill = TRUE, padding = 10") label.set_alignment(0, 0) box1.pack_start(label, gtk.FALSE, gtk.FALSE, 0) label.show() box2 = make_box(gtk.FALSE, 0, gtk.TRUE, gtk.TRUE, 10) box1.pack_start(box2, gtk.FALSE, gtk.FALSE, 0) box2.show() separator = gtk.HSeparator() # The last 3 arguments to pack_start are: # expand, fill, padding. box1.pack_start(separator, gtk.FALSE, gtk.TRUE, 5) separator.show() elif which == 3: # This demonstrates the ability to use pack_end() to # right justify widgets. First, we create a new box as before. box2 = make_box(gtk.FALSE, 0, gtk.FALSE, gtk.FALSE, 0) # Create the label that will be put at the end. label = gtk.Label("end") # Pack it using pack_end(), so it is put on the right # side of the hbox created in the make_box() call. box2.pack_end(label, gtk.FALSE, gtk.FALSE, 0) # Show the label. label.show() # Pack box2 into box1 box1.pack_start(box2, gtk.FALSE, gtk.FALSE, 0) box2.show() # A separator for the bottom. separator = gtk.HSeparator() # 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) # pack the separator into the vbox (box1) created near the start # of __init__() box1.pack_start(separator, gtk.FALSE, gtk.TRUE, 5) separator.show() # Create another new hbox.. remember we can use as many as we need! quitbox = gtk.HBox(gtk.FALSE, 0) # Our quit button. button = gtk.Button("Quit") # Setup the signal to terminate the program when the button is clicked button.connect_object("clicked", gtk.mainquit, self.window) # Pack the button into the quitbox. # The last 3 arguments to pack_start are: # expand, fill, padding. quitbox.pack_start(button, gtk.TRUE, gtk.FALSE, 0) # pack the quitbox into the vbox (box1) box1.pack_start(quitbox, gtk.FALSE, gtk.FALSE, 0) # Pack the vbox (box1) which now contains all our widgets, into the # main window. self.window.add(box1) # And show everything left button.show() quitbox.show() box1.show() # Showing the window last so everything pops up at once. self.window.show() def main(): # And of course, our main loop. gtk.main() # Control returns here when main_quit() is called return 0 if __name__ =="__main__": PackBox1(1) main()