这是我在这里发表的第一篇文章。首先,我想为我可怜的英语道歉。我真的希望你能理解我想说的话。
好的,这就是我的问题:我在循环中生成了几个按钮:
int board = 4;
int board_2 = board*board;
GtkWidget *card_button[board_2];
char path[100];
sprintf(path,"res/0.png"); //path to default image
GtkWidget *button_image = gtk_image_new_from_file(path);
for(int i=0; i<board_2; i++)
{
card_button[i] = gtk_button_new();
gtk_button_set_image(card_button[i],button_image);
gtk_grid_attach(GTK_GRID(grid),card_button[i],i%board,(i/board)+1,1,1);
g_signal_connect(G_OBJECT(card_button[i]), "clicked", G_CALLBACK(game_engine), i);
}
game_engine功能:
void game_engine(GtkWidget* widget, gpointer data)
{
int button_id = (int)data;
char path[30];
sprintf(path,"res/%d.png",button_id);
GtkWidget *button_image = gtk_image_new_from_file(path);
gtk_button_set_image(widget, button_image);
}
当我点击按钮时,一切似乎都没问题(图像显示在按钮上),但有时,除了在点击按钮上显示图像外,另一个图像消失。此外,GTK在控制台上显示以下错误:
(Program.exe:4920): Gtk-CRITICAL **: gtk_widget_get_parent: assertion 'GTK_IS_WIDGET (widget)' failed
我做了一些debbuging,发现这个错误是由game_engine函数中的gtk_button_set_image引起的。我不知道接下来该做什么。 提前感谢您的帮助。
答案 0 :(得分:2)
我找到了解决方案。为避免丢失图像,我不得不使用g_object_ref(button_image);
所以有正确的代码:
void game_engine(GtkWidget* widget, gpointer data)
{
int button_id = (int)data;
char path[30];
sprintf(path,"res/%d.png",field[button_id].val);
GtkWidget *button_image = gtk_image_new_from_file(path);
g_object_ref(button_image);
gtk_button_set_image(GTK_BUTTON(widget),button_image);
}
答案 1 :(得分:0)
所以在你的行上
gtk_button_set_image(widget, button_image);
您使用的是GtkWidget *小部件,但gtk_button_set_image需要:
void gtk_button_set_image (GtkButton *button, GtkWidget *image);
所以你可以尝试施放它(GtkButton应该在下面的小部件中)
gtk_button_set_image((GtkButton *)widget, button_image);
或将其交给按钮而不是GtkWidget。 您的错误消息只是告诉您,您使用了错误的类型