php gtk不更新了,[新人求助] gtk控件动态更新

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

楼主可以通过GMainLoop(在Gtk内会包装成在gtk_main())和GSource等方法.相关知识请查阅Glib的手册

以下是Glib手册相关内容及用到的函数devhelp截图,可到glib网站查看

0bb017c850d44a9104fbe7e591548499.png

如果对Glib的对象系统感兴趣可查看相应Gobject手册(跟Glib手册是独立分开的),如下图(devhelp截图,可到glib网站查看)

d04220a149aa1f4e9180e9ba2993baa7.png

这里根据楼主的情况,写了个例子Sample,希望对你或其他人有用.

这是运行时截图

9adbe67fe462e765fca9d4cf20cf165f.png

以下是代码:

/*

* main.c

*

* Created on: 2018年3月5日

* Author: tom

*/

#include

#include

#include

#include

gboolean my_timeout_func (gpointer user_data){

GtkEntry *entry=user_data;

gint index=g_object_get_data(entry,"entry_index");//这里直接忽略GPOINTER_TO_INT(),按编程习惯应写成 gint index=GPOINTER_TO_INT(g_object_get_data(entry,"entry_index"));

gint count=g_object_get_data(entry,"entry_count");//同上

if(count>=10){

return G_SOURCE_REMOVE;//移除该"定时GSource",GMainLoop往后不再执行该"定时GSource".表现为GtkEntry内容不再更新.

}

count++;

g_object_set_data(entry,"entry_count",GINT_TO_POINTER(count));//更新GtkEntry的timeout次数,原内部相应数据会被覆盖;

gchar *str=g_strdup_printf("GtkEntry%d:timeout %d times",index,count);//创建要显示的"字符串".

gtk_entry_set_text(entry,str);//把刚生成的"字符串"设置GtkEntry显示的字符串

g_free(str);//由于创建的"字符串"是内存动态分配,须手动释放字符串

return G_SOURCE_CONTINUE;//继续执行该"定时GSource",表现为GtkEntry内容定时更新.

};

int main(int argc,char *argv[]){

gtk_init(&argc,&argv);

gint i=0;

GtkWindow *mwin=gtk_window_new(GTK_WINDOW_TOPLEVEL);

GtkBox *box=gtk_box_new(GTK_ORIENTATION_VERTICAL,10);//创建可包含10个GtkEntry的GtkBox容器.

GtkEntry *entry[10];//创建Entry控件指针的数组

for(i=0;i<10;i++){

entry[i]=gtk_entry_new();

//由于GtkEntry是承继GObject,所以可以用GObject的方法操作GtkEntry,这里涉及一些GObject的对象系统知识,请查看Glib-Object的开发手册(注意:该手册跟Glib开发手册是分开独立);

//这里注意一下,GINT_TO_POINTER(i)是把int数值转成指针形式,可通过GPOINTER_TO_INT()把数值转回int形式,若嫌麻烦可忽略不用,只是可读性差些.

g_object_set_data(entry[i],"entry_index",GINT_TO_POINTER(i));//往GtkEntry附加自定义数据"entry_index",用于处理GtkEntry的编号

g_object_set_data(entry[i],"entry_count",GINT_TO_POINTER(0));//往GtkEntry附加自定义数据"entry_count",用于处理GtkEntry的timeout次数

g_timeout_add(500,my_timeout_func,entry[i]);//用g_timeout_***方法往主循环添加定时执行函数,每500ms执行函数一次

//还有类似g_timeout_add_seconds(),只是计时单位为妙.下面的注释的语句跟上面功能一样.

//g_timeout_add_seconds(5,my_timeout_func,entry[i]);

//glib还有类似g_idle_add()方法,在Gmain空闲的时候随机执行指定函数,具体请看Glib开发手册GMainLoop一节;

gtk_box_pack_start(box,entry[i],FALSE,FALSE,0);//把GtkEntry放入GtkBox容器;

}

gtk_container_add(mwin,box);//把GtkBox容器放入主窗口;

g_signal_connect(mwin,"delete_event",gtk_main_quit,NULL);

gtk_widget_show_all(mwin);

gtk_main();

return EXIT_SUCCESS;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值