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