2012-09-04 29 views
0

我已經用GTK在C中完成了一個小程序,其中包含一個窗口,一個盒子和一個表格。桌子上塗有一些文件。我想用其他數據刷新表格,但我不知道如何。GTK中的刷新表

此代碼將啓動一個窗口,其中包含GtkTable。該表填寫了定時器處理功能。第一次按1,2,3的順序畫三條線,最後一次按3,2,1的順序寫三條線。但桌子從不刷新。

#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; 
} 
+0

你把你的數據在表中'fill_data()',但你沒有在這裏包含該功能。另一方面,你包含了許多與問題無關的代碼。你能創建一個最小的例子來顯示你想要做什麼嗎? – ptomato

+0

我用你期待的代碼修改了這個問題。 – NEBUC

+1

謝謝!只有請不要刪除你原來的問題,否則這個問題將來就沒有意義了。我編輯它將原始問題放回頂部。 – ptomato

回答

2

你的代碼中有幾個問題:

  • 你沒有你的VBOX添加到您的窗口。這可以通過以下代碼完成: gtk_container_add (GTK_CONTAINER (window), vboxgeneral);

  • 您正在將錯誤的參數(表格窗口小部件)傳遞給您的time_handler函數。在那個函數中,你創建了一個新表,失去了你打包到一個vbox中的前一個表。你可以做的是銷燬前面的表格,並用新標籤創建一個新表格並將其包裝到vbox中。

  • 在主函數中調用time_handler(表)是完全不需要的。計時器已經爲你做了。

修改後的代碼我做(工作代碼,做你的要求)如下:

#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; 
} 
+1

非常感謝!有用。 :) – NEBUC