Linux en Espanol
 
Tutorial GTK3: Poner imágen a un botón en GTK3 (tema #25134)
Publicar nuevo tema  Responder al tema    Foros de discusión -> Linux General
Autor Mensaje
Nathan_1979
Forista


Registrado: 2006-09-22
Mensajes: 337

Publicado: 2017-06-25 05:33:03    Asunto:

Hola a todos,

Los iconos de este elegido vienen de esta especificación (con el fin de tener un conjunto de imágenes
estandar):
https://specifications.freedesktop.org/icon-naming-spec/icon-naming-spec-latest.html

Uno de los quebraderos de cabeza que pueda dar a mas de uno es a la hora de colocar una
imagen a un botón utilizando GTK3.

Esto viene porque en la versión GTK3 por defecto no se muestran las imágenes en los botones. Adjunto el código (GPL3) para que lo ejecutes con el siguiente comando en una terminal de GNU/Linux:

// Compilación:
$ gcc -Wall -std=c99 boton_con_imagen.c `pkg-config --cflags --libs gtk+-3.0` -o boton_con_imagen

// Ejecución
// si hiciese falta los permisos:
// $ chmod +x boton_con_imagen
$ ./boton_con_imagen

La idea del siguiente código exclusivo para el foro es que lo podáis compilar, estudiar y modificar (he puesto comentarios con alguna explicación importante):

/**
* Consulte la Licencia Pública General de GNU, versión 3 o
* posterior para obtener más detalles
*
* Como colocar una imagen en un botón con la interfaz GTK3
*
*
* @author: Nathan_1979 para linuxespanol.com
*/
#include <gtk/gtk.h>

/* Another callback */
static void destroy(GtkWidget *widget, gpointer data ) {
gtk_main_quit();
}

int main(int argc, char *argv[]) {

GtkWidget *window;
gtk_init (&argc, &argv);

/* create a new window */
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_container_set_border_width(GTK_CONTAINER(window), 0);
gtk_window_set_title(GTK_WINDOW(window), \"Titulo linuxespanol.com\");
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);

gint w, h;
gtk_window_get_default_size(GTK_WINDOW(window), &w, &h);

/** signal para la ventana */
g_signal_connect(window, \"delete-event\", G_CALLBACK(destroy), NULL);

/** boton 1*/
GtkWidget *boton1 = gtk_button_new_with_label(\"Go down\");
g_object_set(G_OBJECT(boton1),
\"always-show-image\", TRUE,
NULL);
gtk_button_set_image_position(GTK_BUTTON(boton1), GTK_POS_LEFT);
gtk_button_set_image(GTK_BUTTON(boton1),
gtk_image_new_from_icon_name(\"go-down\", GTK_ICON_SIZE_BUTTON));

/** boton 2*/
GtkWidget *boton2 = gtk_button_new_with_label(\"folder-new\");
g_object_set(G_OBJECT(boton2),
\"always-show-image\", TRUE,
NULL);
gtk_button_set_image_position(GTK_BUTTON(boton2), GTK_POS_LEFT);
gtk_button_set_image(GTK_BUTTON(boton2),
gtk_image_new_from_icon_name(\"folder-new\", GTK_ICON_SIZE_BUTTON));

/** boton 3*/
GtkWidget *boton3 = gtk_button_new_with_label(\"help-faq\");
g_object_set(G_OBJECT(boton3),
\"always-show-image\", TRUE,
NULL);
gtk_button_set_image_position(GTK_BUTTON(boton3), GTK_POS_LEFT);
gtk_button_set_image(GTK_BUTTON(boton3),
gtk_image_new_from_icon_name(\"help-faq\", GTK_ICON_SIZE_BUTTON));


GtkWidget *caja_horizontal = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
gtk_container_set_border_width(GTK_CONTAINER(caja_horizontal), 15);
gtk_box_pack_start(GTK_BOX(caja_horizontal), boton1, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(caja_horizontal), boton2, TRUE, FALSE, 0);
gtk_box_pack_end(GTK_BOX(caja_horizontal), boton3, FALSE, FALSE, 0);


/** las cajas verticales se llenan de arriba a abajo o viceversa, segun
utilicemos gtk_box_pack_start o gtk_box_pack_end
Es importante la caja vertical, para que los botones queden de una altura
fija y no crezcan. Edita este codigo y elimina la caja vertical para verlo
es decir aniadiendo a la window la caja horizontal de esta forma:

gtk_container_add(GTK_CONTAINER(window), caja_horizontal);

*/
GtkWidget *caja_vertical = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
gtk_box_pack_start(GTK_BOX(caja_vertical), caja_horizontal, FALSE, FALSE, 0);

gtk_container_add(GTK_CONTAINER(window), caja_vertical);

gtk_widget_show_all(window);
gtk_main();
return 0;
}


Un abrazo.
Nathan_1979
Forista


Registrado: 2006-09-22
Mensajes: 337

Publicado: 2017-06-25 05:38:37    Asunto:

Edito: no he podido añadir el tema a la categoría \"Programación\"





La marca registrada Linux (R) se usa siguiendo la sublicensia obtenida del "Linux Mark Institute",
el LICENCIATARIO exclusivo de Linus Torvalds, propietario de la marca en EEUU y otros países
The registered trademark Linux (R) is used pursuant to a sublicense from the Linux Mark Institute,
the exclusive LICENSEE of Linus Torvalds, owner of the mark in the U.S. and other countries