C 带图像的按钮-图像消失

C 带图像的按钮-图像消失,c,button,gtk,C,Button,Gtk,这是我在这里的第一篇文章。首先,我想为我糟糕的英语道歉。我真的希望你能理解我想说的话 好的,这就是我的问题:我在循环中生成了几个按钮: 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

这是我在这里的第一篇文章。首先,我想为我糟糕的英语道歉。我真的希望你能理解我想说的话

好的,这就是我的问题:我在循环中生成了几个按钮:

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);
}
当我单击按钮时,一切似乎都正常(按钮上显示图像),但有时,除了在单击的按钮上显示图像外,另一个图像也会消失。此外,GTK在控制台上显示以下错误:

(Program.exe:4920): Gtk-CRITICAL **: gtk_widget_get_parent: assertion 'GTK_IS_WIDGET (widget)' failed
我做了一些除错,发现这个错误是由游戏引擎功能中的gtk_按钮_设置_图像引起的。我不知道下一步该怎么办。 提前感谢您的帮助。

请拨打您的电话

     gtk_button_set_image(widget, button_image);
您正在使用GtkWidget*小部件,但gtk_按钮_设置_图像需要:

    void gtk_button_set_image (GtkButton *button, GtkWidget *image);
所以您可以尝试转换它(GtkButton应该在小部件的层次结构下面)

或者将其作为按钮而不是GtkWidget移交。
您的错误消息只是告诉您,您使用了错误的类型

我找到了解决方案。为了避免丢失图像,我必须使用
g\u object\u ref(按钮图像)
所以这里有正确的代码:

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);
}

GtkWidget*card_按钮[i]处的
i
值是多少?我想
I
应该是
board_2
。你说得对-那是个打字错误。在我的源文件中,我将其正确声明为
GtkWidget*card_按钮[board_2]不,不幸的是它没有帮助。我注意到,当图像消失时,终端错误信息不会出现…是总是同一个图像消失还是随机出现?嗯。。。在下一个按钮“导致”消失之前,我点击的按钮上的图像总是消失。例如:我单击了按钮1、2、3、4,在单击按钮3上的4=>消失图像后,图像消失。我还注意到,每单击6个按钮,图像就会消失。如果使用gprints显示id和路径,它们设置正确吗?一般来说,增加你的脱胶量。。。可能会出现错误。路径和id设置正确。我还将一些其他变量放在终端上进行去bug,并且每个值都是确定的。我将在linux环境中编译我的代码。我怀疑,但也许Windows本身有问题。
    gtk_button_set_image((GtkButton *)widget, 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);
}