Как добавлять метки на экран динамически? Gtk+
for(int i =0;i<14;++i){
gtk_box_pack_start(GTK_BOX(MessagesBox),gtk_label_new("метка"),0,0,0);
gtk_widget_show_all(MainWindow);
sleep(1);
}
По идее после каждой итерации должно показываться обновленное,новое окно, но оно показывается только после вызова gtk_main(), почему так происходит и как мне динамически добавлять новые метки на экран?
Ответы (2 шт):
У вас не правильно сделано. Окно будет показываться только после того, как выполнение функции дойдет до пети. например до g_main_loop. в которой обрабатываются разные события. чтобы добавлять новые виджеты в MessageBox, должно быть какое-то условие, например кликнуть мышью по кнопке. но если хочется действительно добавлять label каждую секунду, то пишите так.
...
это отдельный поток.
for(int i =0;i<14;++i){
gtk_box_pack_start(GTK_BOX(MessagesBox),gtk_label_new("метка"),0,0,0);
sleep(1);
}
...
это основной поток.
GMainLoop *loop = g_main_loop_new ( NULL, FALSE );
... инициализация окна ...
gtk_widget_show_all(MainWindow);
g_main_loop_run ( loop );
}
Опираясь на ответ xverizex, я понял что нужно создать отдельный поток, так что упрощу ответ:
pthread_t pthread;//сюда записывается информация о потоке(его id)
pthread_create(&pthread,NULL,send_label,NULL);//создаем и запускаем поток
gtk_main();//передаем управление gtk+
...
void *send_label()
{
for(int i =0;i<14;++i){
gtk_box_pack_start(GTK_BOX(MessagesBox),gtk_label_new("label"),0,0,0);//упаковываем новую метку в контейнер(или виджет,хз как называется) MessagesBox
gtk_widget_show_all(MainWindow);//показываем обновленное окно
sleep(1);
}
}
то есть в отдельном потоке выполняется функция, которая каждую секунду помещает на экран надпись "label", конечно если отдельных потоков больше чем один, то нужно использовать мьютексы, но здесь он один.