GTK显示小部件

GTK showing widget

本文关键字:小部 显示 GTK      更新时间:2023-10-16

我正在写一个小棋盘游戏,它必须在点击按钮后在按钮上添加并显示图像,然后调用其他一些函数在其他按钮上显示图像,但程序并没有像我想象的那样运行,直到所有这些函数都完成了,小部件才显示出来。这里是调试:

Breakpoint 1, GameControl::button_clicked (widget=0x80dad08, data=0x80563e0) at interface.cc:582
582 image = gtk_image_new_from_file ("arrow.bmp");
(gdb) step
583 gtk_container_add (GTK_CONTAINER (widget), image);
(gdb) step
584 gtk_widget_show (image);
(gdb) step
585 computer_move (widget, &control);
(gdb) step
GameControl::computer_move (widget=0x80dad08, data=0x80563e0) at interface.cc:520
520 computer_moving = true;
(gdb) break interface.cc:586
Breakpoint 2 at 0x804cdab: file interface.cc, line 586.
(gdb) continue
Continuing.
Breakpoint 2, GameControl::button_clicked (widget=0x80dad08, data=0x80563e0) at interface.cc:586
586 break;
(gdb) step
593 end_dialog ();
(gdb) next
595 }
(gdb) step
0xb7b1c243 in g_cclosure_marshal_VOID__VOIDv () from /usr/lib/i386-linux-gnu/libgobject-2.0.so.0
(gdb) step
Single stepping until exit from function g_cclosure_marshal_VOID__VOIDv,which has no line number information.
0xb7b33a29 in g_signal_emit_valist () from /usr/lib/i386-linux-gnu/libgobject-2.0.so.0
(gdb) next
Single stepping until exit from function g_signal_emit_valist,
which has no line number information.
0xb7b34453 in g_signal_emit () from /usr/lib/i386-linux-gnu/libgobject-2.0.so.0
(gdb) continue
Continuing.
[Thread 0xb6b86b40 (LWP 7820) exited]
[Thread 0xb61ffb40 (LWP 7821) exited]
[Inferior 1 (process 7817) exited normally]

在执行最后一个continue命令之前,小部件显示,因为不知何故,当它转到"gtk_widget_show()"时,小部件没有显示,有什么建议吗?

GTK+与大多数GUI工具包一样,是事件驱动的。

您应该从回调返回,这样主事件循环(gtk_main())就可以处理下一个事件,否则整个程序就会冻结。

如果您想在回调进行到一半时处理一些事件,请显式执行。直接从文档:

/* computation going on */
while (gtk_events_pending ())
    gtk_main_iteration ();
/* computation continued */