0

私は、ウィンドウ、ボックス、およびボックス内のテーブルを備えたGTKを使用してCで小さなプログラムを実行しました。テーブルはいくつかのファイルで描かれています。他のデータでテーブルを更新したいのですが、方法がわかりません。

このコードは、。でウィンドウを起動しますGtkTable。このテーブルはタイマーハンドル機能で埋められます。最初は1、2、3の順序で3本の線を引き、最後は3、2、1の順序で3本の線を書きます。ただし、テーブルが更新されることはありません。

#include <stdlib.h>
#include <gtk/gtk.h>


static gboolean time_handler(GtkWidget *table);
gboolean launched;

int main( int argc, char *argv[])
{
    GtkWidget *window;
    GtkWidget *vboxgeneral;
    gchar *title;
    GtkWidget *table;

    gtk_init(&argc, &argv);

    /* WINDOW */
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    title = "Test GtkTable";

    gtk_window_set_title(GTK_WINDOW(window), title);
    gtk_window_set_default_size(GTK_WINDOW(window), 200, 100);
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);

    /* ADDING GTKHBOX TO MAIN WINDOW */
    vboxgeneral = gtk_vbox_new(FALSE, 0);

    /* ADDING GTKTABLE TO VBOX */
    table = gtk_table_new(1,1,FALSE);
    gtk_box_pack_start(GTK_BOX(vboxgeneral), table, FALSE, FALSE, 0);

    /* SHOW ALL */
    gtk_widget_show_all(window);

    /* ACTIONS */
    g_signal_connect_swapped(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);

    /* START TIMER */
    g_timeout_add(10000, (GSourceFunc) time_handler, (gpointer) window);
    time_handler(table);

    gtk_main();


    return 0;
}



static gboolean time_handler(GtkWidget *table)
{
    GtkWidget *widget;
    gboolean result = FALSE;

    /* ADDING TABLE DEFINITION */

    if(!launched)
    {
        table = gtk_table_new(3,1,FALSE);

        widget = gtk_label_new("File 1");
        gtk_label_set_justify(GTK_LABEL(widget), GTK_JUSTIFY_CENTER);
        gtk_table_attach_defaults (GTK_TABLE (table), widget, 0, 1, 0, 1);
        widget = gtk_label_new("File 2");
        gtk_label_set_justify(GTK_LABEL(widget), GTK_JUSTIFY_CENTER);
        gtk_table_attach_defaults (GTK_TABLE (table), widget, 0, 1, 1, 2);
        widget = gtk_label_new("File 3");
        gtk_label_set_justify(GTK_LABEL(widget), GTK_JUSTIFY_CENTER);
        gtk_table_attach_defaults (GTK_TABLE (table), widget, 0, 1, 2, 3);


        launched = TRUE;
        result = TRUE;

        g_print("Timer executed fisrt time!\n");
    }
    else
    {
        table = gtk_table_new(3,1,FALSE);

        widget = gtk_label_new("File 3");
        gtk_label_set_justify(GTK_LABEL(widget), GTK_JUSTIFY_CENTER);
        gtk_table_attach_defaults (GTK_TABLE (table), widget, 0, 1, 0, 1);
        widget = gtk_label_new("File 2");
        gtk_label_set_justify(GTK_LABEL(widget), GTK_JUSTIFY_CENTER);
        gtk_table_attach_defaults (GTK_TABLE (table), widget, 0, 1, 1, 2);
        widget = gtk_label_new("File 1");
        gtk_label_set_justify(GTK_LABEL(widget), GTK_JUSTIFY_CENTER);
        gtk_table_attach_defaults (GTK_TABLE (table), widget, 0, 1, 2, 3);



        result = FALSE;
        g_print("Timer executed last time!\n");
    }

     gtk_widget_draw(table, NULL);


    return result;
}
4

1 に答える 1

2

コードにはいくつかの問題があります。

  • vboxをウィンドウに追加しませんでした。これは、次のコードで実行できます。 gtk_container_add (GTK_CONTAINER (window), vboxgeneral);

  • 間違ったパラメーター(テーブルウィジェット)をtime_handler関数に渡していました。その関数では、vboxにパックした前のテーブルを失う新しいテーブルを作成しました。できることは、前のテーブルを破棄し、新しいラベルを使用して新しいテーブルを作成し、それをvboxにパックすることです。

  • main関数で行われるtime_handler(table)の呼び出しは、完全に不要です。タイマーはすでにあなたのためにそれをします。

私が作成した改訂コード(あなたが求めたことを実行する作業コード)は次のとおりです。

#include <stdlib.h>
#include <gtk/gtk.h>

static gboolean time_handler(GtkWidget *table);
gboolean launched;

int main( int argc, char *argv[])
{
    GtkWidget *window;
    GtkWidget *vboxgeneral;
    gchar *title;

    gtk_init(&argc, &argv);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    title = "Test GtkTable";

    gtk_window_set_title(GTK_WINDOW(window), title);
    gtk_window_set_default_size(GTK_WINDOW(window), 200, 100);
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);

    /* ADDING GTKHBOX TO MAIN WINDOW */
    vboxgeneral = gtk_vbox_new(FALSE, 0);

    /* This step was missing! */
    gtk_container_add (GTK_CONTAINER (window), vboxgeneral);

    gtk_widget_show_all(window);

    g_signal_connect_swapped(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);

    /* START TIMER */
    /* refresh in 1 second, change to the desired amount */
    g_timeout_add(1000, (GSourceFunc) time_handler, (gpointer) vboxgeneral);

    gtk_main();

    return 0;
}



static gboolean time_handler(GtkWidget *vbox)
{
    GtkWidget *widget;
    static GtkWidget *table = NULL;
    gboolean result = FALSE;

    /* if you want only the new labels to appear and not the previous ones you can: */
    /* 1. destroy the table and create a new one. This will be done */
    /* 2. hide all previous labels in the table and create and show the new ones */

    if (table != NULL) {
        /* destroy previous table packed into vbox */
        gtk_widget_destroy(table);
    }

    table = gtk_table_new(3,1,FALSE); /* create new table for the new labels */

    if(!launched) {

        widget = gtk_label_new("File 1");
        gtk_label_set_justify(GTK_LABEL(widget), GTK_JUSTIFY_CENTER);
        gtk_table_attach_defaults (GTK_TABLE (table), widget, 0, 1, 0, 1);
        widget = gtk_label_new("File 2");
        gtk_label_set_justify(GTK_LABEL(widget), GTK_JUSTIFY_CENTER);
        gtk_table_attach_defaults (GTK_TABLE (table), widget, 0, 1, 1, 2);
        widget = gtk_label_new("File 3");
        gtk_label_set_justify(GTK_LABEL(widget), GTK_JUSTIFY_CENTER);
        gtk_table_attach_defaults (GTK_TABLE (table), widget, 0, 1, 2, 3);


        launched = TRUE;
        result = TRUE;

        g_print("Timer executed first time!\n");
    } else {
        /* table = gtk_table_new(3,1,FALSE); */

        widget = gtk_label_new("File 3");
        gtk_label_set_justify(GTK_LABEL(widget), GTK_JUSTIFY_CENTER);
        gtk_table_attach_defaults (GTK_TABLE (table), widget, 0, 1, 0, 1);
        widget = gtk_label_new("File 2");
        gtk_label_set_justify(GTK_LABEL(widget), GTK_JUSTIFY_CENTER);
        gtk_table_attach_defaults (GTK_TABLE (table), widget, 0, 1, 1, 2);
        widget = gtk_label_new("File 1");
        gtk_label_set_justify(GTK_LABEL(widget), GTK_JUSTIFY_CENTER);
        gtk_table_attach_defaults (GTK_TABLE (table), widget, 0, 1, 2, 3);


        launched = FALSE;
        result = FALSE;
        g_print("Timer executed last time!\n");
    }

    /* ADD THE NEWLY CREATED TABLE TO THE VBOX */
    gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0);
    /* VERY IMPORTANT: SHOW ALL THE NEW LABELS PACKED INTO THE TABLE */
    gtk_widget_show_all(table);

    return result;
}
于 2012-09-05T02:45:48.350 に答える