2014-03-18 10 views
0

GtkEntry 필드간에 데이터를 조작하는 작은 프로그램을 만들려고합니다. 이렇게하려면 전역 변수를 사용하고 있습니다. 하지만 g_print 함수를 사용하여 내용을 표시하면 NULL 데이터가 나타납니다! 내 방식이 왜 잘못 되었나요?GtkEntry 조작

#include <gtk/gtk.h> 

const gchar *entry0_text; 
const gchar *entry1_text; 
const gchar *entry2_text; 

static void my_function (GtkWidget *widget, GtkWidget *entry) 
{ 
    g_print ("Entry0 contents: %s\n", gtk_entry_get_text (GTK_ENTRY (entry))); 

    g_print ("Entry1 contents: %s\n", *entry0_text); 
    g_print ("Entry2 contents: %s\n", *entry1_text); 

} 

static void 
activate (GtkApplication *app, 
      gpointer  user_data) 
{ 
    GtkWidget *window; 
    GtkWidget *grid; 
    GtkWidget *button; 
    GtkWidget *entry0; 
    GtkWidget *entry1; 
    GtkWidget *entry2; 

    window = gtk_application_window_new (app); 
    gtk_window_set_title (GTK_WINDOW (window), ":-)"); 
    gtk_window_set_default_size (GTK_WINDOW (window), 300, 300); 
    gtk_container_set_border_width (GTK_CONTAINER (window), 20); 

    grid = gtk_grid_new(); 
    gtk_container_add (GTK_CONTAINER (window), GTK_WIDGET (grid)); 

    entry0 = gtk_entry_new(); 
    gtk_grid_attach (GTK_GRID (grid), entry0, 0, 0, 1, 1); 
    entry0_text = gtk_entry_get_text (GTK_ENTRY (entry0)); 

    entry1 = gtk_entry_new(); 
    gtk_grid_attach (GTK_GRID (grid), entry1, 1, 0, 1, 1); 
    entry1_text = gtk_entry_get_text (GTK_ENTRY (entry1)); 

    entry2 = gtk_entry_new(); 
    gtk_grid_attach (GTK_GRID (grid), entry2, 0, 1, 1, 1); 
    entry2_text = gtk_entry_get_text (GTK_ENTRY (entry2)); 

    button = gtk_button_new(); 
    gtk_grid_attach (GTK_GRID (grid), button, 1, 1, 1, 1); 
    g_signal_connect (button, "clicked", G_CALLBACK (my_function), entry0); 

    gtk_widget_show_all (window); 
} 

int 
main (int argc, char **argv) 
{ 
    GtkApplication *app; 
    int status; 

    app = gtk_application_new ("org.gtk.example", G_APPLICATION_FLAGS_NONE); 
    g_signal_connect (app, "activate", G_CALLBACK (activate), NULL); 
    status = g_application_run (G_APPLICATION (app), argc, argv); 
    g_object_unref (app); 

    return status; 
} 

내가 데비안 GNU/리눅스를 사용하고이 같은 스크립트를 컴파일하고 있습니다 : GCC를 pkg-config --libs --cflags gtk+-3.0 -o $ 2 $ (1)

감사합니다!

답변

1

entry0_text - entry2.text 값은 프로그램 시작 중에 검색됩니다. 그러나 아직 항목이 없기 때문에 빈 문자열이 포함됩니다.

activate 함수 안에 있지 않고 콜백 함수 my_function에있는 모든 입력 위젯에 gtk_entry_get_text을 사용해야합니다.

게다가, 두 번째 및 세 번째 g_print를 잘못 사용하고 있습니다. 사용해야합니다

g_print ("Entry1 contents: %s\n", entry1_text); 
g_print ("Entry2 contents: %s\n", entry2_text); 

프로그램이 시작된 후 entry1_text 및 entry2_text에는 빈 문자열이 들어 있습니다. 그러나 * entry1_text와 * entry2_text를 사용하면 빈 문자열을받지는 않지만,이 문자열의 첫 번째 요소 인 '\ 0'널 문자가 종료되므로이 g_prints에 'null'이 수신됩니다. 따라서 * entry1_text 대신 entry1_text를 사용하십시오.

다음 코드가 올바르게 작동하고 있습니다. 단순화를 위해 입력 위젯과 문자열을 전역 변수로 사용했습니다.

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

GtkWidget *entry0; 
GtkWidget *entry1; 
GtkWidget *entry2; 

const gchar *entry0_text; 
const gchar *entry1_text; 
const gchar *entry2_text; 

static void my_function (void) 
{ 
    entry0_text = gtk_entry_get_text (GTK_ENTRY (entry0)); 
    entry1_text = gtk_entry_get_text (GTK_ENTRY (entry1)); 
    entry2_text = gtk_entry_get_text (GTK_ENTRY (entry2)); 

    g_print ("Entry0 contents: %s\n", entry0_text); 
    g_print ("Entry1 contents: %s\n", entry1_text); 
    g_print ("Entry2 contents: %s\n", entry2_text); 

} 

static void 
activate (GtkApplication *app, 
      gpointer  user_data) 
{ 
    GtkWidget *window; 
    GtkWidget *grid; 
    GtkWidget *button; 

    window = gtk_application_window_new (app); 
    gtk_window_set_title (GTK_WINDOW (window), ":-)"); 
    gtk_window_set_default_size (GTK_WINDOW (window), 300, 300); 
    gtk_container_set_border_width (GTK_CONTAINER (window), 20); 

    grid = gtk_grid_new(); 
    gtk_container_add (GTK_CONTAINER (window), GTK_WIDGET (grid)); 

    entry0 = gtk_entry_new(); 
    gtk_grid_attach (GTK_GRID (grid), entry0, 0, 0, 1, 1); 

    entry1 = gtk_entry_new(); 
    gtk_grid_attach (GTK_GRID (grid), entry1, 1, 0, 1, 1); 

    entry2 = gtk_entry_new(); 
    gtk_grid_attach (GTK_GRID (grid), entry2, 0, 1, 1, 1); 

    button = gtk_button_new(); 
    gtk_grid_attach (GTK_GRID (grid), button, 1, 1, 1, 1); 
    g_signal_connect (button, "clicked", G_CALLBACK (my_function), NULL); 

    gtk_widget_show_all (window); 
} 

int 
main (int argc, char **argv) 
{ 
    GtkApplication *app; 
    int status; 

    app = gtk_application_new ("org.gtk.example", G_APPLICATION_FLAGS_NONE); 
    g_signal_connect (app, "activate", G_CALLBACK (activate), NULL); 
    status = g_application_run (G_APPLICATION (app), argc, argv); 
    g_object_unref (app); 

    return status; 
} 
+0

이 코드는 정상적으로 작동합니다. 이제 조금 더 공부하고 데이터를 조작 해 보겠습니다. 나중에 보자. –