Table of Contents
We've almost seen all there is to see of the button widget. It's pretty simple. There is however more than one way to create a button. You can use Gtk2::Button::new_with_label() or Gtk2::Button::new_with_mnemonic() (which can be shortened to just Gtk2::Button::new() ) to create a button with a label, use Gtk2::Button::new_from_stock() to create a button containing the image and text from a stock item or use Gtk2::Button::new() with no arguments to create a blank button. 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 Gtk2::Box::pack_start() function, and then use the Gtk2::Box::add() method call to pack the box into the button.
Here's an example of using Gtk2::Button::new() to create a button with a 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.
use Glib qw/TRUE FALSE/;
use Gtk2 '-init';
# Create a new hbox with an image and a label packed into it and return
# the box.
sub xpm_label_box {
my ($xpm_filename, $label_text) = @_;
# create box for image and label
my $box = Gtk2::HBox->new(FALSE, 0);
$box->set_border_width(2);
# now on to the image stuff
my $image = Gtk2::Image->new_from_file($xpm_filename);
# Create a label for the button
my $label = Gtk2::Label->new($label_text);
# pack the image and label into the box
$box->pack_start($image, FALSE, FALSE, 3);
$box->pack_start($label, FALSE, FALSE, 3);
$image->show;
$label->show;
return $box
}
# our usual callback function
sub callback {
my $widget = shift;
my $data = shift;
printf "Hello again - %s was pressed\n", $data;
}
##################
# main starts here
# create a new window
my $window = Gtk2::Window->new('toplevel');
$window->set_title("Pixmap'd Buttons!");
# it's a good idea to do this for all windows
$window->signal_connect("destroy" => sub { Gtk2->main_quit; });
$window->signal_connect("delete-event" => sub { Gtk2->main_quit; });
# sets the border width of the window
$window->set_border_width(10);
# create a new button
my $button = Gtk2::Button->new();
# connect the 'clicked' signal of the button to our callback
$button->signal_connect("clicked" => \&callback, "cool button");
# this calls our box creating function
my $box = xpm_label_box("info.xpm", "cool button");
# pack and show all our widgets
$box->show();
$button->add($box);
$button->show();
$window->add($button);
$window->show();
# rest in the GTK main loop and wait for the fun to begin!
Gtk2->main;
0;
|
The xpm_label_box() function could be used to pack images and labels into any widget that can be a container.
The Gtk2::Button widget has the following signals: