C 在GTK中更新接口
我想制作一个显示时间的应用程序(最终,我试图在不使用现有智能镜像API的情况下将自己的简单智能镜像整合在一起)。我使用GTK3的用户界面,但我有困难找到一个解决方案,使用户界面更新的时间(我没有经验,在前端或GTK所以忍受我) 我尝试过在下面所示的view3代码的某些部分放置循环,但是我发现一旦调用gtk_main(),我就无法退出gtk主循环,因此while循环会重新开始并调用我编写的时间函数 我尝试过使用像gtk_main_iteration_do(gtk_false())(false,这样它就不会阻塞)这样的函数,但我显然对这些函数了解不够,因为它不起作用。如果我将gtk_main()排除在循环之外,显然gtk_main()永远不会被调用,我的应用程序窗口甚至不会打开 我已经在下面的main中展示了相关代码,接下来是我编写的get_time_string()函数的定义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,这样
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;
}