GTK Linux C通过Button Widget从Entry Box获取输入

时间:2013-07-27 23:27:03

标签: c linux gtk

我的桌子上装满了输入框,标签和按钮。

目前,如果我编译代码,我可以从文本框中获取输入,但仅当用户按下回车键时,文本才会来自他们当前正在输入的框。

我希望能够在按下“登录”按钮时从两个文本框中获取输入。我尝试使用与输入框上的回车键相同的回调函数,但GTK给了我一个错误。

如果有人能告诉我一些允许我从表格中的输入框中获取文本的代码(我知道从表格和v / box中检索数据的方法不同),我们将非常感激,我似乎无法在任何教程中找到它。

将更新w /工作代码。

尝试将状态栏附加到表时出错:

(条目:5526):Gtk-CRITICAL **:gtk_table_attach:断言`child-> parent == NULL'失败

(条目:5526):GLIB-GObject-WARNING **:来自GtkTable' to GtkStatusbar'的无效演员

1 个答案:

答案 0 :(得分:4)

您的回调函数(名为callback)需要访问两个GtkEntry小部件才能获取其值。有几种方法可以实现。许多GTK C程序使用全局变量或具有文件范围的全局变量(即在文件中的任何函数之外声明为static的变量)。

在执行任何功能之前,删除文件顶部附近的entry1entry2变量:

static GtkWidget *entry1 = 0;
static GtkWidget *entry2 = 0;

然后像这样修改回调:

/* Our callback.
 * The data passed to this function is printed to stdout */
static void callback( GtkWidget *widget, gpointer data)
{
    const gchar *entry_text1;
    const gchar *entry_text2;

    g_print ("Hello again - %s was pressed\n", (char *) data);

    entry_text1 = gtk_entry_get_text (GTK_ENTRY (entry1));
    entry_text2 = gtk_entry_get_text (GTK_ENTRY (entry2));
    g_print ("Contents of entries:\n%s\n%s\n", entry_text1, entry_text2);
}

您还应对enter_callback函数进行类似的修改,不要忘记从GtkWidget删除GtkEntry main的{​​{1}}指针。


作为使用(静态)全局变量的替代方法,创建一个数据结构来保存条目:

typedef struct login_data
{
    GtkWidget *entry1;
    GtkWidget *entry2;
} login_data;

然后将其传递给回调(而不是之前的文本字符串),并且回调会像这样改变:

static void callback( GtkWidget *widget, gpointer data)
{
    login_data* ld = (login_data*)data;
    const gchar *entry_text1;
    const gchar *entry_text2;

    entry_text1 = gtk_entry_get_text (GTK_ENTRY (ld->entry1));
    entry_text2 = gtk_entry_get_text (GTK_ENTRY (ld->entry2));
    g_print ("Contents of entries:\n%s\n%s\n", entry_text1, entry_text2);
}

数据结构是动态分配的,以防止它超出范围(在简单应用程序中不是绝对必要的),这是在使用g_signal_connect将回调连接到条目之前完成的:

login_data* ld = g_malloc(sizeof(*ld));

// callback function to execute when login is clicked
g_signal_connect (LoginButton, "clicked", G_CALLBACK (callback), (gpointer) ld);

使用此方法,您必须将对entry1entry2的所有引用更改为ld->entry1ld->entry2。最后,在程序退出之前,您应该在动态分配的结构g_free上调用g_free(ld)

顺便说一下,对于这个程序,您不需要两个单独的回调,删除enter_callback,只使用callback