Claudia Aguirre, el 26 de noviembre a las 12:48 me escribiste:
> Hola,
>
> Lo probe haciendo:
>
> Gtk::Widget *widget = new Gtk::Image("Recursos\\salidaPacman.PNG");
> this->add(*widget);
> this->show();
>
> siendo 'this' un Gtk::button. Pero me muestra un warning diciendo que ya
> posee una imagen (lo cual es verdad ) . Entonces supongo debo eliminarle
> esa imagen para poder colocarle una nueva.
>
> "gtk --WARNING: Attempting to add a widget with type gtkmm__GtkImage to a
> gtkmm__GtkButton, but as a GtkBin subclass a gtkmm__GtkButton can only
> contain one widget at a time; it already contains a widget of type
> gtkmm__GtkImage"
>
> Todavia no encontre exactamente como borrarlo. Pense en algo como:
Tal vez no tengas que borrarlo :)
> Gtk::Widget *imagenVieja =this->get_image();
> imagenVieja->_destroy_c_instance();
Es MUY raro que quiera hacer eso. Meterse con la API de C significa hacer
cosas muy nasty.
> pero lanza este error:
> 'Gtk::Object::_destroy_c_instance' : cannot access protected member
> declared in class 'Gtk::Object'
Y lo bien que hace ;)
> No se si estoy haciendo las cosas en forma correcta... la verdad probe
> varias cosas para poder cambiar la imagen desde el codigo...
Estuve revisando un poco la referencia[1] (que es tu amiga) y lo que tenés
que usar es gtk_image_set_from_file()[2] (o su contraparte[3] gtkmm),
previo obtener la imagen del botón con gtk_button_get_image()[4] (o su
contraparte[5] gtkmm).
Te adjunto un ejemplo (basado en [6]) que cambia la imagen al apretar el
botón. El ejemplo usa gtk_image_set_from_stock() pero la idea es
exactamente la misma.
En windows tendrás que ingeniártelas para compilarlo vos (por el archivo
que querés arbrir asumo que estás en windows =), pero si tuvieras un Linux
a mano podés usar:
gcc -Wall -g `pkg-config --cflags --libs gtk+-2.0` -o boton boton.c
[1] http://library.gnome.org/devel/gtk/unstable/index.html
[2]
http://library.gnome.org/devel/gtk/unstable/GtkImage.html#gtk-image-set-from-file
[3]
http://gtkmm.org/docs/gtkmm-2.4/docs/reference/html/classGtk_1_1Image.html#ac6da118aed4ade08b2a4556bf8ee508
[4]
http://library.gnome.org/devel/gtk/unstable/GtkButton.html#gtk-button-get-image
[5]
http://gtkmm.org/docs/gtkmm-2.4/docs/reference/html/classGtk_1_1Button.html#05d38d982c358af37e66eb6f0dd62640
[6] http://www.fi.uba.ar/materias/7542/ejemplos/gtk+/boton.c
--
Leandro Lucarella (luca) | Blog colectivo: http://www.mazziblog.com.ar/blog/
----------------------------------------------------------------------------
GPG Key: 5F5A8D05 (F8CD F9A7 BF00 5431 4145 104C 949E BFB6 5F5A 8D05)
----------------------------------------------------------------------------
1950 we were 3 billion people on the earth,
today we are 6 billion people
/* vim: set et sw=4 sts=4 :
*
* Basado en un ejemplo de http://www.gtk.org/tutorial/
*
* Se compila con:
* gcc -o boton `pkg-config --cflags --libs gtk+-2.0` boton.c
*
*/
#include <gtk/gtk.h>
/* Funci�n 'callback' para atender la se�al "clicked" del bot�n */
static void on_boton_clicked(GtkWidget* boton, gpointer data)
{
GtkWidget* image;
static int switched = 0;
g_print("[recibido el evento clicked]\n");
if (!switched)
{
image = gtk_button_get_image(GTK_BUTTON(boton));
if (image)
gtk_image_set_from_stock(GTK_IMAGE(image), GTK_STOCK_OK,
GTK_ICON_SIZE_BUTTON);
else
g_print("huston!\n");
switched = 1;
}
else
gtk_main_quit();
}
/* Funci�n 'callback' para atender la se�al del evento "delete_event" */
static gboolean on_delete_event(GtkWidget* widget, GdkEvent* event,
gpointer data)
{
g_print ("[recibido el evento delete_event]\n");
g_print ("Presione el boton para salir!!!.\n");
/* si se devuelve TRUE, la ventana no se destruye, si se devuelve
* FALSE, la ventana se destruye, emitiendo la se�al "destroy" */
return FALSE;
}
/* Funci�n 'callback' para atender la se�al "destroy" de la ventana. */
static void destruir(GtkWidget* widget, gpointer data)
{
g_print ("[recibido el evento destroy]\n");
/* finaliza el loop de gtk_main() y libera memoria */
gtk_main_quit();
}
/* Programa */
int main(int argc, char* argv[])
{
/* GtkWidget almacena cualquier tipo de widget */
GtkWidget* ventana;
GtkWidget* boton;
gtk_init(&argc, &argv);
/********************************* VENTANA *******************************/
/* creo ventana principal */
ventana = gtk_window_new(GTK_WINDOW_TOPLEVEL);
/* conecto la se�al "delete_event" de la ventana a la callback
* on_delete_event() */
g_signal_connect(G_OBJECT(ventana), "delete_event",
G_CALLBACK(on_delete_event), NULL);
/* conecto la se�al "destroy" de la ventana a la callback destruir()
* esta se�al se emite cuando se llama a gtk_widget_destroy() */
g_signal_connect(G_OBJECT(ventana), "destroy", G_CALLBACK(destruir),
NULL);
/* pongo un borde a la ventana (espacio libre al rededor del borde) */
gtk_container_set_border_width(GTK_CONTAINER(ventana), 10);
/********************************** BOTON ********************************/
/* creo un bot�n con un texto */
boton = gtk_button_new_from_stock(GTK_STOCK_CANCEL);
/* conecto la se�al "clicked" del bot�n a la callback on_boton_clicked() */
g_signal_connect(G_OBJECT(boton), "clicked", G_CALLBACK(on_boton_clicked),
NULL);
/* agrega el bot�n a la ventana (que es un GtkContainer) */
gtk_container_add(GTK_CONTAINER(ventana), boton);
/********************************* PROGRAMA ******************************/
/* muestro el bot�n */
gtk_widget_show (boton);
/* muestro la ventana */
gtk_widget_show (ventana);
/* podr�a haber utilizado gtk_widget_show_all(ventana) para mostrar la
* ventana y todos los widgets que contenga */
/* comienza el loop de eventos */
gtk_main();
return 0;
}
_______________________________________________
Lista de correo Programacion.
[email protected]
http://listas.fi.uba.ar/mailman/listinfo/programacion