es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo eliminar una imagen de un widget gtk en c?

Actualmente estoy trabajando en una interfaz de usuario con gtk. Lo que he hecho hasta ahora es que puedes seleccionar una imagen de tu archivo y mostrarla con el botón “Abrir”. El problema es que cuando abro una segunda imagen, se agrega la imagen a la ventana sin eliminar la actual. Me gustaría saber cómo cambiar la imagen mostrada cuando el usuario elija abrir otra imagen.

Mi código:

“`
#include <stdio.h>
#include <stdlib.h>
#include <gtk gtk.h="">
#include "SDL/SDL.h"
#include "SDL/SDL_image.h"
#include "../Threshold/delete_color.h"

#define GTK_STOCK_CANCEL ((GtkStock)"gtk-cancel")

GtkWidget *image;
gchar *path;

void cb_quit(GtkWidget *p_widget, gpointer user_data)
{
gtk_main_quit();
(void)p_widget;
(void)user_data;
}

void solve(const gchar* path)
{
SDL_Surface* image;

<pre><code>// Binarization
image = binarization((char*) file_name);
SDL_SaveBMP(image, "binarize.bmp");

// Rotation
//rotation(image);
SDL_SaveBMP(image, "rotation.bmp");

// Grid Detection
SDL_SaveBMP(image, "grid.bmp");

// Case detection
// TODO

// Get the grid.txt
// TODO

// Get the grid solution
// TODO

// Create the solution image
// TODO
</code></pre>

}

static void set_image(const gchar *file_name, gpointer user_data)
{
GtkWidget *pVBox;
GdkPixbuf *pixbuf;
GError *error = NULL;

<pre><code>pVBox = (GtkWidget*) user_data;

int width = gtk_widget_get_allocated_width(pVBox);
int height = gtk_widget_get_allocated_height(pVBox);

pixbuf = gdk_pixbuf_new_from_file("result.bmp", &error);

if (!error)
{
GdkPixbuf *pixbuf_mini = NULL;
pixbuf_mini = gdk_pixbuf_scale_simple(pixbuf,
width,
height – 200,
GDK_INTERP_NEAREST);

image = gtk_image_new_from_pixbuf(pixbuf_mini);
gtk_container_add(GTK_CONTAINER(pVBox), image);
gtk_widget_show(image);
}
</code></pre>

}

void cb_open(GtkWidget *p_widget, gpointer user_data)
{
GtkWidget *p_dialog = NULL;
p_dialog = gtk_file_chooser_dialog_new("Abrir archivo", NULL,
GTK_FILE_CHOOSER_ACTION_OPEN,
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
NULL);

<pre><code>if(gtk_dialog_run (GTK_DIALOG (p_dialog)) == GTK_RESPONSE_ACCEPT)
{
gchar *file_name = NULL;
path = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (p_dialog));
file_name = path;
g_print("%s\n", path);
set_image(file_name, user_data);
g_free (file_name), file_name = NULL;
}

gtk_widget_destroy(p_dialog);
(void)p_widget;
</code></pre>

}

int main(int argc, char **argv)
{
GtkWidget *p_window = NULL;
GtkWidget *p_main_box = NULL;

<pre><code>// Initialisation
gtk_init (&argc, &argv);

// Main window
p_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_position(GTK_WINDOW(p_window), GTK_WIN_POS_CENTER);
gtk_window_set_default_size(GTK_WINDOW(p_window), 600, 400);
g_signal_connect (G_OBJECT (p_window), "destroy",
G_CALLBACK (cb_quit), NULL);

// Main container
p_main_box = gtk_vbox_new(FALSE, 0);
gtk_container_add(GTK_CONTAINER (p_window), p_main_box);

// Exit button
{
GtkWidget *p_button = NULL;
p_button = gtk_button_new_with_label("Salir");
g_signal_connect(G_OBJECT (p_button), "clicked", G_CALLBACK (cb_quit), NULL);
gtk_box_pack_start(GTK_BOX (p_main_box), p_button, FALSE, FALSE, 0);
}

// Open button
{
GtkWidget *p_button = NULL;
p_button = gtk_button_new_with_label ("Abrir");
g_signal_connect (G_OBJECT (p_button), "clicked", G_CALLBACK (cb_open), (gpointer*) p_main_box);
gtk_box_pack_start (GTK_BOX (p_main_box), p_button, FALSE, FALSE, 0);
}

// Display
gtk_widget_show_all(p_window);
g_print("%s\n", path);
gtk_main();
return EXIT_SUCCESS;
</code></pre>

}
“`</stdlib.h></stdio.h>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para cambiar la imagen mostrada cuando el usuario elija abrir otra imagen, es necesario eliminar la imagen actual de la ventana antes de agregar la nueva. Así es como se puede modificar el código para hacerlo:

    1. Crear una función llamada “remove_image()” para eliminar la imagen actual de la ventana. Se puede usar la función “gtk_container_remove()” para hacer esto. Aquí está el código:
      void remove_image(GtkWidget *p_widget, gpointer user_data)
      {
         gtk_container_remove(GTK_CONTAINER (user_data), image);
         (void)p_widget;
      }
      
    2. Llamar a la función “remove_image()” antes de llamar a “set_image()” en “cb_open()”. Esto asegurará que la imagen actual sea eliminada antes de agregar la nueva imagen.
      void cb_open(GtkWidget *p_widget, gpointer user_data)
      {
         GtkWidget *p_dialog = NULL;
         p_dialog = gtk_file_chooser_dialog_new("Open file", NULL,
                 GTK_FILE_CHOOSER_ACTION_OPEN,
                 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
                 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
                 NULL);
      
         if(gtk_dialog_run(GTK_DIALOG(p_dialog)) == GTK_RESPONSE_ACCEPT)
         {
             gchar *file_name = NULL;
             path = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(p_dialog));
             file_name = path;
             g_print("%s\n", path);
             remove_image(p_widget, user_data);
             set_image(file_name, user_data);
             g_free(file_name), file_name = NULL;
         }
      
         gtk_widget_destroy(p_dialog);
         (void)p_widget;
      }
      

    Con estas modificaciones, la imagen actual será eliminada de la ventana antes de mostrar la nueva imagen cuando el usuario elija abrir otra imagen.

Comments are closed.