如何重置 GTK 映像?
How to reset a GTK Image?
我正在使用 c 使用 GTK 3 创建 GUI,我遇到了一个问题,我希望每次按下按钮时回调函数(名为“draw”)打印一个图像。问题是图像不刷新,它在第一个下方添加另一个图像并让第一个可见。我尝试使用 gtk_image_clear 和 gtk_image_set 但问题仍然存在,有帮助吗?
回调原型
g_signal_connect(G_OBJECT(pDrawBtn), "clicked", G_CALLBACK(Draw),(GtkWidget*) pDiceDrawBox);
“绘图”功能
#include <gtk/gtk.>
void Draw(GtkWidget *pDrawBtn, GtkWidget *Box)
{
GtkWidget *pImage;
GtkWidget *pCheck;
int face = 0;
pCheck = gtk_container_get_children(GTK_CONTAINER(Box));
pImage = gtk_image_new_from_file("img/de/de1.png");
if (pCheck != NULL)
{
gtk_image_clear(GTK_IMAGE(pImage));
}
srand(time(NULL));
face = (rand() % (6 - 1 + 1)) + 1;
switch (face)
{
case 1:
gtk_image_set_from_file(GTK_IMAGE(pImage), "img/de/de1.png");
break;
case 2:
gtk_image_set_from_file(GTK_IMAGE(pImage), "img/de/de2.png");
break;
case 3:
gtk_image_set_from_file(GTK_IMAGE(pImage), "img/de/de3.png");
break;
case 4:
gtk_image_set_from_file(GTK_IMAGE(pImage), "img/de/de4.png");
break;
case 5:
gtk_image_set_from_file(GTK_IMAGE(pImage), "img/de/de5.png");
break;
case 6:
gtk_image_set_from_file(GTK_IMAGE(pImage), "img/de/de6.png");
break;
}
gtk_box_pack_start(GTK_BOX(Box), pImage, TRUE, TRUE, 0);
gtk_widget_show_all(Box);
}
您无条件地在回调中调用 gtk_box_pack_start(Box, pImage ..)
,因此 GTK 会在每次调用该函数时按照要求执行操作:它将图像小部件(再次)添加到框中。您应该只添加一次图像,方法是确保在第一次执行回调时调用该函数,或者预先将其添加到框中。
另请注意以下内容不正确:
GtkWidget *pCheck;
//...
pCheck = gtk_container_get_children(GTK_CONTAINER(Box));
gtk_container_get_children()
returns a GList*
,不是元素本身。因此,根据您的实际需要,您应该更改 pCheck
的类型,或者确保首先从返回的列表中提取它。
我正在使用 c 使用 GTK 3 创建 GUI,我遇到了一个问题,我希望每次按下按钮时回调函数(名为“draw”)打印一个图像。问题是图像不刷新,它在第一个下方添加另一个图像并让第一个可见。我尝试使用 gtk_image_clear 和 gtk_image_set 但问题仍然存在,有帮助吗?
回调原型
g_signal_connect(G_OBJECT(pDrawBtn), "clicked", G_CALLBACK(Draw),(GtkWidget*) pDiceDrawBox);
“绘图”功能
#include <gtk/gtk.>
void Draw(GtkWidget *pDrawBtn, GtkWidget *Box)
{
GtkWidget *pImage;
GtkWidget *pCheck;
int face = 0;
pCheck = gtk_container_get_children(GTK_CONTAINER(Box));
pImage = gtk_image_new_from_file("img/de/de1.png");
if (pCheck != NULL)
{
gtk_image_clear(GTK_IMAGE(pImage));
}
srand(time(NULL));
face = (rand() % (6 - 1 + 1)) + 1;
switch (face)
{
case 1:
gtk_image_set_from_file(GTK_IMAGE(pImage), "img/de/de1.png");
break;
case 2:
gtk_image_set_from_file(GTK_IMAGE(pImage), "img/de/de2.png");
break;
case 3:
gtk_image_set_from_file(GTK_IMAGE(pImage), "img/de/de3.png");
break;
case 4:
gtk_image_set_from_file(GTK_IMAGE(pImage), "img/de/de4.png");
break;
case 5:
gtk_image_set_from_file(GTK_IMAGE(pImage), "img/de/de5.png");
break;
case 6:
gtk_image_set_from_file(GTK_IMAGE(pImage), "img/de/de6.png");
break;
}
gtk_box_pack_start(GTK_BOX(Box), pImage, TRUE, TRUE, 0);
gtk_widget_show_all(Box);
}
您无条件地在回调中调用 gtk_box_pack_start(Box, pImage ..)
,因此 GTK 会在每次调用该函数时按照要求执行操作:它将图像小部件(再次)添加到框中。您应该只添加一次图像,方法是确保在第一次执行回调时调用该函数,或者预先将其添加到框中。
另请注意以下内容不正确:
GtkWidget *pCheck;
//...
pCheck = gtk_container_get_children(GTK_CONTAINER(Box));
gtk_container_get_children()
returns a GList*
,不是元素本身。因此,根据您的实际需要,您应该更改 pCheck
的类型,或者确保首先从返回的列表中提取它。