Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在GTK中更新接口_C_User Interface_Gtk - Fatal编程技术网

C 在GTK中更新接口

C 在GTK中更新接口,c,user-interface,gtk,C,User Interface,Gtk,我想制作一个显示时间的应用程序(最终,我试图在不使用现有智能镜像API的情况下将自己的简单智能镜像整合在一起)。我使用GTK3的用户界面,但我有困难找到一个解决方案,使用户界面更新的时间(我没有经验,在前端或GTK所以忍受我) 我尝试过在下面所示的view3代码的某些部分放置循环,但是我发现一旦调用gtk_main(),我就无法退出gtk主循环,因此while循环会重新开始并调用我编写的时间函数 我尝试过使用像gtk_main_iteration_do(gtk_false())(false,这样

我想制作一个显示时间的应用程序(最终,我试图在不使用现有智能镜像API的情况下将自己的简单智能镜像整合在一起)。我使用GTK3的用户界面,但我有困难找到一个解决方案,使用户界面更新的时间(我没有经验,在前端或GTK所以忍受我)

我尝试过在下面所示的view3代码的某些部分放置循环,但是我发现一旦调用gtk_main(),我就无法退出gtk主循环,因此while循环会重新开始并调用我编写的时间函数

我尝试过使用像gtk_main_iteration_do(gtk_false())(false,这样它就不会阻塞)这样的函数,但我显然对这些函数了解不够,因为它不起作用。如果我将gtk_main()排除在循环之外,显然gtk_main()永远不会被调用,我的应用程序窗口甚至不会打开

我已经在下面的main中展示了相关代码,接下来是我编写的get_time_string()函数的定义

int
main (int   argc,
      char *argv[])
{
  // initialization and setting up window, packing widgets, etc

  // view3
  // populate buffer with time string
  // and insert into text view
  view3 = gtk_text_view_new();
  gtk_widget_set_name(view3, "view3");
  buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view3));
  gtk_text_buffer_get_iter_at_offset(buffer, &iter, 0);
  gtk_text_buffer_insert(buffer, &iter, get_time_string(), -1);
  gtk_text_view_set_editable(GTK_TEXT_VIEW(view3), FALSE);
  gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(view3), FALSE);


  // More widget packing, setting up UI

  gtk_widget_show_all(window);

  gtk_main();

  return 0;
}
get_time_string()的定义


除非您真的需要或知道该做什么,否则不应该使用mainloop迭代

诀窍是使用g_timeout_add或g_idle_add及其变体。由于您希望定期更新时间(对于分钟分辨率,您将每60秒更新一次),因此可以使用g_timeout_add_seconds

为了便于说明,我将使用get_time_string函数将秒添加到时间字符串中,并每秒更新一次,但创建一个非常简单的窗口,仅显示一个时间标签:

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

char* get_time_string(){
  time_t time_var = time(NULL);
  struct tm *info;
  char *time_string = calloc(100, sizeof(char));
  info = localtime( &time_var );
  strftime(time_string, 100, "%I:%M:%S %p", info);
  return time_string;
}

gboolean update_label_time (gpointer user_data) {
   gchar *t = get_time_string();
   gtk_label_set_text(GTK_LABEL(user_data), t);
   g_free (t);
   return G_SOURCE_CONTINUE;
}

int main (int argc, char *argv[])
{
   gchar *t;
   GtkWidget *window;
   GtkWidget *label_time; 

   gtk_init(&argc, &argv);

   window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
   gtk_window_set_default_size (GTK_WINDOW(window), 300, 200);
   t = get_time_string();
   label_time = gtk_label_new (t);
   g_free (t);

   g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
   gtk_container_add (GTK_CONTAINER(window), label_time);


   g_timeout_add_seconds(0.5, update_label_time, label_time);


   gtk_widget_show_all(window);

   gtk_main();

   return 0;
}
#包括
#包括
#包括
char*get_time_string(){
time\u t time\u var=时间(空);
结构tm*信息;
char*time_string=calloc(100,sizeof(char));
info=localtime(&time\u var);
strftime(时间字符串,100,“%I:%M:%S%p”,信息);
返回时间字符串;
}
gboolean更新标签时间(gpointer用户数据){
gchar*t=获取时间字符串();
gtk_标签_设置_文本(gtk_标签(用户数据),t);
g_自由(t);
返回G_SOURCE_CONTINUE;
}
int main(int argc,char*argv[])
{
gchar*t;
GtkWidget*窗口;
GtkWidget*标签时间;
gtk_init(&argc,&argv);
窗口=gtk_窗口_新建(gtk_窗口_顶层);
gtk_窗口设置默认大小(gtk_窗口(窗口),300,200);
t=获取时间字符串();
label_time=gtk_label_new(t);
g_自由(t);
g_信号连接(g_对象(窗口),“销毁”,g_回调(gtk_主退出),NULL);
gtk_容器添加(gtk_容器(窗口),标签时间);
g_超时_添加_秒(0.5,更新_标签时间,标签时间);
gtk_小部件_全部显示(窗口);
gtk_main();
返回0;
}
结果应该是一个标签每秒更新一次的窗口:


GLib有自己的,你应该使用它。

嘿,Jose,你正在泄漏
get\u time\u string
中分配的字符串的内存。另一个问题是
g_timeout\u add_seconds
并不准确,文档中说
请注意,计时器的第一次调用对于1秒的超时可能并不精确。因此,使用500毫秒采样的
g\u timeout\u add
应该避免在2秒钟内显示相同的时间,例如。@libforce你说得对,我的错。谢谢你的反馈。祝你一切顺利!德纳达,天涯若比邻;)@自由力量:祝贺你的葡萄牙语:D Tudo de bom。
#include <time.h>
#include <stdlib.h>
#include <gtk/gtk.h>

char* get_time_string(){
  time_t time_var = time(NULL);
  struct tm *info;
  char *time_string = calloc(100, sizeof(char));
  info = localtime( &time_var );
  strftime(time_string, 100, "%I:%M:%S %p", info);
  return time_string;
}

gboolean update_label_time (gpointer user_data) {
   gchar *t = get_time_string();
   gtk_label_set_text(GTK_LABEL(user_data), t);
   g_free (t);
   return G_SOURCE_CONTINUE;
}

int main (int argc, char *argv[])
{
   gchar *t;
   GtkWidget *window;
   GtkWidget *label_time; 

   gtk_init(&argc, &argv);

   window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
   gtk_window_set_default_size (GTK_WINDOW(window), 300, 200);
   t = get_time_string();
   label_time = gtk_label_new (t);
   g_free (t);

   g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
   gtk_container_add (GTK_CONTAINER(window), label_time);


   g_timeout_add_seconds(0.5, update_label_time, label_time);


   gtk_widget_show_all(window);

   gtk_main();

   return 0;
}