将字符串从inputfield传递给函数失败 - GTK c语言

时间:2014-01-04 15:00:48

标签: c gtk gtk3

我在c中遇到gtk问题。我尝试按照教程进行操作但是当单击窗口小部件中的按钮时,我无法将文本条目传递给函数。

代码编译得很好,但是当我按下按钮时,我会收到几个警告,并且应该打印的文本条目中的字符串为空

我做错了什么?

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


 static GtkWidget *asset_label;
 static GtkWidget *frame;
 static GtkWidget *entry;

 static void entry_Submit(GtkWidget *widget, GtkWidget *entry)
 {
    const gchar *text = gtk_entry_get_text(GTK_ENTRY (entry));
    printf ("Result: %s\n", text);

    gtk_widget_destroy(GTK_WIDGET(asset_label));
    asset_label = gtk_label_new (text);
    gtk_container_add (GTK_CONTAINER (frame), asset_label);

    gtk_widget_show_all(frame);

 }



 static void destroy(GtkWidget *widget, gpointer data)
 {
     gtk_main_quit ();
 }



 static void initialize_window(GtkWidget* window)
 {
   gtk_window_set_title(GTK_WINDOW(window),"My Window"); //Set window title
   gtk_window_set_default_size (GTK_WINDOW (window), 400, 200); //Set default size for the window
   g_signal_connect (window, "destroy", G_CALLBACK (destroy), NULL); //End application when close button clicked

 }

 int main (int argc, char *argv[])
 {
   GtkWidget *window,*table,*label, *button;
   gtk_init(&argc, &argv);


   //Create the main window
   window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
   initialize_window(window);


    /* Create a 1x2 table */
    table = gtk_table_new (3, 3, TRUE);
    gtk_container_add (GTK_CONTAINER (window), table);


   /* create a new label. */
   label = gtk_label_new ("Enter some text:" );
   //gtk_misc_set_alignment (GTK_MISC (label), 0, 0);
   gtk_table_set_homogeneous(GTK_TABLE (table), TRUE);
   gtk_table_attach_defaults (GTK_TABLE (table), label, 1, 2, 0, 1);


   //create a text box
   entry = gtk_entry_new ();
   //gtk_entry_set_text (GTK_ENTRY (entry), "");
   gtk_entry_set_max_length (GTK_ENTRY (entry),0);
   gtk_table_attach_defaults (GTK_TABLE (table), entry, 0, 1, 0, 1);



   button = gtk_button_new_with_label("Calculate");
   g_signal_connect_swapped (button, "clicked", G_CALLBACK (entry_Submit), entry);
   gtk_table_attach_defaults (GTK_TABLE (table), button, 0, 2, 1, 2);



   //gtk_widget_show (button);

    gtk_widget_show_all(window);

   gtk_main ();
   return 0;
 }

点击按钮后,我得到了这个结果:

 Result: (null)

1 个答案:

答案 0 :(得分:3)

回调或注册回调的方式存在问题(因为修复其中任何一个应该可以解决您的问题)。
默认情况下,clicked回调将GtkButton作为第一个参数,将gpointer数据作为第二个参数。通过使用g_signal_connect_swapped,你会说在回调函数中,参数将被交换,即第一个参数将是gpointer数据(代码中为GtkEntry),第二个参数{{1} }。但是在您的回调函数中,您将第二个参数GtkButton视为entryGtkButtonGtkEntry。使用g_signal_connect代替g_signal_connect_swapped或在回调函数中使用第一个参数widget作为GtkEntry
附注:关于警告,如果您发布的代码是完整代码,则在第一次执行期间回调函数entry_Submitasset_label为空,因此gtk_widget_destroy(GTK_WIDGET(asset_label));将发出警告。此外,frame在回调函数中使用之前未分配。

希望这有帮助!