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

Responder a