0

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

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]

直到执行最后一个继续命令,小部件才会显示,因为当它转到 "gtk_widget_show ()" 时,小部件没有显示,有什么建议吗?

4

1 回答 1

2

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

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

如果你想在回调的中途处理一些事件,你可以明确地这样做。直接来自文档:

/* computation going on */

while (gtk_events_pending ())
    gtk_main_iteration ();

/* computation continued */
于 2013-08-03T06:31:45.707 回答