C GtkEntry手法

C GtkEntry手法,c,gtk,gtkentry,C,Gtk,Gtkentry,我正在尝试制作一个小程序来管理GtkEntry字段之间的数据。为此,我使用全局变量。但是使用g_print函数来显示我得到的内容是空数据!我怎么了 #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_p

我正在尝试制作一个小程序来管理GtkEntry字段之间的数据。为此,我使用全局变量。但是使用g_print函数来显示我得到的内容是空数据!我怎么了

#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;
}
#包括
常量gchar*entry0_文本;
常量gchar*输入1_文本;
常量gchar*entry2_文本;
静态void my_函数(GtkWidget*小部件,GtkWidget*条目)
{
g_print(“条目0内容:%s\n”,gtk_条目获取文本(gtk_条目(条目));
g_打印(“Entry1内容:%s\n”,*entry0_文本);
g_print(“Entry2内容:%s\n”,*entry1_文本);
}
静态空隙
激活(GTK应用程序*应用程序,
gpointer用户(U数据)
{
GtkWidget*窗口;
GtkWidget*网格;
GtkWidget*按钮;
GtkWidget*entry0;
GtkWidget*入口1;
GtkWidget*入口2;
窗口=gtk_应用程序_窗口_新(应用程序);
gtk_窗口设置标题(gtk_窗口(窗口),“:-”);
gtk_窗口设置默认大小(gtk_窗口(窗口),300300);
gtk_容器设置_边框宽度(gtk_容器(窗口),20);
grid=gtk_grid_new();
gtk_容器添加(gtk_容器(窗口)、gtk_小部件(网格));
entry0=gtk_entry_new();
gtk_网格连接(gtk_网格(网格),入口0,0,0,1,1);
entry0_text=gtk_entry_get_text(gtk_entry(entry0));
entry1=gtk_entry_new();
gtk_格栅连接(gtk_格栅(格栅),入口1,1,0,1,1);
entry1_text=gtk_entry_get_text(gtk_entry(entry1));
entry2=gtk_entry_new();
gtk_网格连接(gtk_网格(网格),入口2,0,1,1,1);
entry2_text=gtk_entry_get_text(gtk_entry(entry2));
按钮=gtk_按钮_新();
gtk_网格连接(gtk_网格(网格),按钮,1,1,1,1);
g_信号连接(按钮“点击”,g_回调(my_函数),entry0);
gtk_小部件_全部显示(窗口);
}
int
主(内部argc,字符**argv)
{
GTK应用程序*app;
智力状态;
app=gtk_application_new(“org.gtk.example”,G_application_FLAGS_NONE);
g_信号连接(应用程序,“激活”,g_回调(激活),空);
状态=g_应用程序运行(g_应用程序(应用程序)、argc、argv);
g_object_unref(应用程序);
返回状态;
}
我正在使用Debian GNU/Linux,并使用如下脚本进行编译: gcc
pkg配置--libs--cflags gtk+-3.0
-o$2$1


谢谢大家!

entry0_text-entry2.text的值在程序启动期间检索。但由于还没有输入,它们包含空字符串

对于回调函数
my\u函数
中的所有条目小部件,您必须使用
gtk\u entry\u get\u text
,而不是
activate
函数中的条目小部件

此外,您使用的第二和第三个g_打印错误;你应该使用

g_print ("Entry1 contents: %s\n", entry1_text);
g_print ("Entry2 contents: %s\n", entry2_text);
请记住,程序启动后,entry1_文本和entry2_文本包含空字符串。但是,对于*entry1_text和*entry2_text,您将不会收到空字符串,而是该字符串的第一个元素,即终止的'\0'空字符,这就是为什么您会收到这些g_打印的'null'。因此,请使用entry1_文本而不是*entry1_文本

以下代码工作正常;为了简单起见,我使用了条目小部件和字符串作为全局变量

#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;
}
#包括
#包括
GtkWidget*entry0;
GtkWidget*入口1;
GtkWidget*入口2;
常量gchar*entry0_文本;
常量gchar*输入1_文本;
常量gchar*entry2_文本;
静态void my_函数(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_打印(“Entry0内容:%s\n”,Entry0_文本);
g_打印(“Entry1内容:%s\n”,Entry1_文本);
g_打印(“Entry2内容:%s\n”,Entry2_文本);
}
静态空隙
激活(GTK应用程序*应用程序,
gpointer用户(U数据)
{
GtkWidget*窗口;
GtkWidget*网格;
GtkWidget*按钮;
窗口=gtk_应用程序_窗口_新(应用程序);
gtk_窗口设置标题(gtk_窗口(窗口),“:-”);
gtk_窗口设置默认大小(gtk_窗口(窗口),300300);
gtk_容器设置_边框宽度(gtk_容器(窗口),20);
grid=gtk_grid_new();
gtk_容器添加(gtk_容器(窗口)、gtk_小部件(网格));
entry0=gtk_entry_new();
gtk_网格连接(gtk_网格(网格),入口0,0,0,1,1);
entry1=gtk_entry_new();
gtk_格栅连接(gtk_格栅(格栅),入口1,1,0,1,1);
entry2=gtk_entry_new();
gtk_网格连接(gtk_网格(网格),入口2,0,1,1,1);
按钮=gtk_按钮_新();
gtk_网格连接(gtk_网格(网格),按钮,1,1,1,1);
g_信号连接(按钮“点击”,g_回调(my_函数),空);
gtk_小部件_全部显示(窗口);
}
int
主(内部argc,字符**argv)
{
GTK应用程序*app;
智力状态;
app=gtk_application_new(“org.gtk.example”,G_application_FLAGS_NONE);
g_信号连接(应用程序,“激活”,g_回调(激活),空);
状态=g_应用程序运行(g_应用程序(应用程序)、argc、argv);
g_object_unref(应用程序);
返回状态;
}

此代码工作正常,谢谢。现在我将进一步研究它,并尝试操作数据。再见。