Gtk не показывает фиксированный макет для изображений - PullRequest
0 голосов
/ 23 апреля 2020

Я загружаю три изображения, когда я нажимаю на среднее изображение, оно скрывается, а через несколько секунд заменяется другим. Проблема в том, что в то же время изображения на внешней стороне собираются вместе, пока изображение не будет показано снова. Я бы хотел, чтобы они всегда отображались на отдельных полях и не имели никакого эффекта движения.

Это то, что я попробовал

#include <gtk/gtk.h>
static void destroy (GtkWidget*, gpointer);
static gboolean delete_event (GtkWidget*, GdkEvent*, gpointer);
void image_clicked();
gboolean show_image ();

GtkWidget *image[3];

int main (int argc,
char *argv[])
{
    GtkWidget *window, *hbox, *event_box;

    gtk_init (&argc, &argv);
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 35);
    event_box = gtk_event_box_new ();

    gtk_window_set_title (GTK_WINDOW (window), "Hello World!");
    gtk_container_set_border_width (GTK_CONTAINER (window), 10);
    gtk_widget_set_size_request (window, 200, 100);

    image[0] = gtk_image_new_from_file ("1.png");
    image[1] = gtk_image_new_from_file ("2.png");
    image[2] = gtk_image_new_from_file ("3.png");

    gtk_container_add(GTK_CONTAINER (window), hbox);
    gtk_container_add(GTK_CONTAINER (hbox), image[0]);
    gtk_container_add(GTK_CONTAINER (hbox), event_box);
    gtk_container_add(GTK_CONTAINER (event_box), image[1]);
    gtk_container_add(GTK_CONTAINER (hbox), image[2]);

    /* Connect the main window to the destroy and delete-event signals. */

    g_signal_connect (G_OBJECT (window), "destroy",
    G_CALLBACK (destroy), NULL);
    g_signal_connect (G_OBJECT (window), "delete_event",
    G_CALLBACK (delete_event), NULL);
    g_signal_connect (G_OBJECT (event_box), "button_press_event", G_CALLBACK (image_clicked), NULL);

    gtk_widget_show_all (window);

    gtk_main ();

    return 0;
}

void image_clicked() {

    gtk_widget_hide(image[1]);

    gtk_image_set_from_file (GTK_IMAGE((image[1])), "4.png");

    g_timeout_add(3000, (GSourceFunc)show_image, NULL);

}

gboolean show_image () {

    gtk_widget_show(image[1]);

    return FALSE;
}


/* Stop the GTK+ main loop function when the window is destroyed. */
static void
destroy (GtkWidget *window,
gpointer data)
{
    gtk_main_quit ();
}

/* Return FALSE to destroy the widget. By returning TRUE, you can cancel
* a delete-event. This can be used to confirm quitting the application. */
static gboolean
delete_event (GtkWidget *window,
GdkEvent *event,
gpointer data)
{
    return FALSE;
}
...