Table of Contents
We've almost seen all there is to see of the button widget. It's pretty simple. You can use the gtk.Button() function to create a button with a label by passing a string parameter, or to create a blank button by not specifying a label string. It's then up to you to pack a label or pixmap into this new button. To do this, create a new box, and then pack your objects into this box using the usual pack_start() method, and then use the add() method to pack the box into the button.
The function to create a button is:
button = gtk.Button(label=None, stock=None) |
if label text is specified it is used as the text on the button. If stock is specified it is used to select a stock icon and text label for the button. The stock items are:
STOCK_DIALOG_INFO STOCK_DIALOG_WARNING STOCK_DIALOG_ERROR STOCK_DIALOG_QUESTION STOCK_DND STOCK_DND_MULTIPLE STOCK_ADD STOCK_APPLY STOCK_BOLD STOCK_CANCEL STOCK_CDROM STOCK_CLEAR STOCK_CLOSE STOCK_CONVERT STOCK_COPY STOCK_CUT STOCK_DELETE STOCK_EXECUTE STOCK_FIND STOCK_FIND_AND_REPLACE STOCK_FLOPPY STOCK_GOTO_BOTTOM STOCK_GOTO_FIRST STOCK_GOTO_LAST STOCK_GOTO_TOP STOCK_GO_BACK STOCK_GO_DOWN STOCK_GO_FORWARD STOCK_GO_UP STOCK_HELP STOCK_HOME STOCK_INDEX STOCK_ITALIC STOCK_JUMP_TO STOCK_JUSTIFY_CENTER STOCK_JUSTIFY_FILL STOCK_JUSTIFY_LEFT STOCK_JUSTIFY_RIGHT STOCK_MISSING_IMAGE STOCK_NEW STOCK_NO STOCK_OK STOCK_OPEN STOCK_PASTE STOCK_PREFERENCES STOCK_PRINT STOCK_PRINT_PREVIEW STOCK_PROPERTIES STOCK_QUIT STOCK_REDO STOCK_REFRESH STOCK_REMOVE STOCK_REVERT_TO_SAVED STOCK_SAVE STOCK_SAVE_AS STOCK_SELECT_COLOR STOCK_SELECT_FONT STOCK_SORT_ASCENDING STOCK_SORT_DESCENDING STOCK_SPELL_CHECK STOCK_STOP STOCK_STRIKETHROUGH STOCK_UNDELETE STOCK_UNDERLINE STOCK_UNDO STOCK_YES STOCK_ZOOM_100 STOCK_ZOOM_FIT STOCK_ZOOM_IN STOCK_ZOOM_OUT |
The buttons.py program provides an example of using gtk.Button() to create a button with an image and a label in it. I've broken up the code to create a box from the rest so you can use it in your programs. There are further examples of using images later in the tutorial. Figure 6.1 shows the window containing a button with both a pixmap and a label:
The source code for the buttons.py program is:
1 #!/usr/bin/env python 2 3 # example-start buttons buttons.c 4 5 import pygtk 6 pygtk.require('2.0') 7 import gtk 8 9 # Create a new hbox with an image and a label packed into it 10 # and return the box. 11 12 def xpm_label_box(parent, xpm_filename, label_text): 13 # Create box for xpm and label 14 box1 = gtk.HBox(gtk.FALSE, 0) 15 box1.set_border_width(2) 16 17 # Get the style of the button to get the 18 # background color. 19 style = parent.get_style() 20 21 # Now on to the image stuff 22 image = gtk.Image() 23 image.set_from_file(xpm_filename) 24 25 # Create a label for the button 26 label = gtk.Label(label_text) 27 28 # Pack the pixmap and label into the box 29 box1.pack_start(image, gtk.FALSE, gtk.FALSE, 3) 30 box1.pack_start(label, gtk.FALSE, gtk.FALSE, 3) 31 32 image.show() 33 label.show() 34 return box1 35 36 class Buttons: 37 # Our usual callback method 38 def callback(self, widget, data=None): 39 print "Hello again - %s was pressed" % data 40 41 def __init__(self): 42 # Create a new window 43 self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) 44 45 self.window.set_title("Image'd Buttons!") 46 47 # It's a good idea to do this for all windows. 48 self.window.connect("destroy", lambda wid: gtk.main_quit()) 49 self.window.connect("delete_event", lambda a1,a2:gtk.main_quit()) 50 51 # Sets the border width of the window. 52 self.window.set_border_width(10) 53 54 # Create a new button 55 button = gtk.Button() 56 57 # Connect the "clicked" signal of the button to our callback 58 button.connect("clicked", self.callback, "cool button") 59 60 # This calls our box creating function 61 box1 = xpm_label_box(self.window, "info.xpm", "cool button") 62 63 # Pack and show all our widgets 64 button.add(box1) 65 66 box1.show() 67 button.show() 68 69 self.window.add(button) 70 self.window.show() 71 72 def main(): 73 gtk.main() 74 return 0 75 76 if __name__ == "__main__": 77 Buttons() 78 main() |
Lines 12-34 define the xpm_label_box() helper function which creates a horizontal box with a border width of 2 (lines 14-15), populates it with an image (lines 22-23) and a label (line 26).
Lines 3g-70 define the Buttons class. Lines 41-70 define the instance initialization method which creates a window (line 43), sets the title (line 45), connects the "delete_event" and "destroy" signals (lines 48-49). Line 55 creates the button without a label. It's "clicked" signal gets connected to the callback() method in line 58. The xpm_label_box() function is called in line 61 to create the image and label to put in the button in line 64.
The xpm_label_box() function could be used to pack xpm's and labels into any widget that can be a container.
The Button widget has the following signals:
pressed - emitted when pointer button is pressed within Button widget released - emitted when pointer button is released within Button widget clicked - emitted when pointer button is pressed and then released within Button widget enter - emitted when pointer enters Button widget leave - emitted when pointer leaves Button widget |