2009-10-14 5 views
1

사용자가 buttion을 클릭 할 때 GtkImage에서 이미지를 변경하려고하므로 아래 코드를 시도했지만 작동하지 않습니다.응용 프로그램이 실행 중일 때 GtkImage의 "file"속성을 변경하는 방법

/* 
* Compile me with: 
* gcc -o tut tut.c $(pkg-config --cflags --libs gtk+-2.0 gmodule-2.0) 
*/ 

#include <gtk/gtk.h> 


G_MODULE_EXPORT gboolean on_button1_clicked(
       GtkWidget  *event_box, 
          GdkEventButton *event, 
          gpointer  data) 
{ 
    GtkImage *image; 
    image = GTK_IMAGE(data); 
    g_return_val_if_fail(image, FALSE); 

    g_object_set(image, "file","/home/2.png", NULL); 
    g_print ("Event box clicked at coordinates %f,%f\n", 
      event->x, event->y); 
    /* Returning TRUE means we handled the event, so the signal 
    * emission should be stopped (don't call any further 
    * callbacks that may be connected). Return FALSE 
    * to continue invoking callbacks. 
    */ 
    return TRUE; 
} 
int 
main(int argc, 
     char **argv) 
{ 
    GtkBuilder *builder; 
    GtkWidget *window; 
    GtkWidget *image; 
    GError  *error = NULL; 

    /* Init GTK+ */ 
    gtk_init(&argc, &argv); 


    /* Create new GtkBuilder object */ 
    builder = gtk_builder_new(); 
    /* Load UI from file. If error occurs, report it and quit application. 
    * Replace "tut.<b style="color:black;background-color:#ffff66">glade</b>" with your saved project. */ 
    if(! gtk_builder_add_from_file(builder, "tut_3.xml", &error)) 
    { 
     g_warning("%s", error->message); 
     g_free(error); 
     return(1); 
    } 

    /* Get main window pointer from UI */ 
    GtkImage image = GTK_WIDGET(gtk_builder_get_object(builder, "image1")); 

    /* Connect signals */ 
    gtk_builder_connect_signals(builder, data->image); 

    /* Destroy builder, since we don't need it anymore */ 
    g_object_unref(G_OBJECT(builder)); 

    /* Show window. All other widgets are automatically shown by GtkBuilder */ 
    gtk_widget_show(data->window); 

    /* Start main loop */ 
    gtk_main(); 

    return(0); 
} 

답변

1

ptomato의 답변에 추가하려면 gtk_object_set()가 작동해야하지만 일을하는 데는 우회적 인 방법입니다. 기존 GtkImage의 내용을 디스크 파일의 컨텍스트로 바꾸는보다 일반적인 API 호출을 보려면 here을보십시오.

+0

파일 속성을 설정하는 것은 gtk_image_set_from_file과 동일한 __the입니다. http://git.gnome.org/cgit/gtk+/tree/gtk/gtkimage.c#n340 – ntd

3

버튼을 클릭하고 잡으려고 GtkEventBox를 사용할 필요가 없습니다 - 단지 GtkButton의 "클릭"신호에 연결이.

다음은 내가 원하는 것으로 생각하는 코드의 버전입니다. 여기

/* 
* Compile me with: 
* gcc -o tut tut.c $(pkg-config --cflags --libs gtk+-2.0 gmodule-2.0) 
*/ 

#include <gtk/gtk.h> 


G_MODULE_EXPORT gboolean on_button1_clicked(
         GtkButton *button, 
         gpointer  data) 
{ 
    GtkImage *image; 
    image = GTK_IMAGE(data); 
    g_return_val_if_fail(image, FALSE); 

    g_object_set(image, "file","icon2.png", NULL); 
    g_print ("Button clicked\n"); 
} 
int 
main(int argc, 
     char **argv) 
{ 
    GtkBuilder *builder; 
    GtkWidget *window; 
    GtkWidget *image; 
    GError  *error = NULL; 

    /* Init GTK+ */ 
    gtk_init(&argc, &argv); 


    /* Create new GtkBuilder object */ 
    builder = gtk_builder_new(); 
    /* Load UI from file. If error occurs, report it and quit application. 
    * Replace "tut.<b style="color:black;background-color:#ffff66">glade</b>" with your saved project. */ 
    if(! gtk_builder_add_from_file(builder, "tut_3.xml", &error)) 
    { 
     g_warning("%s", error->message); 
     g_free(error); 
     return(1); 
    } 

    /* Get main window pointer from UI */ 
    window = GTK_WIDGET(gtk_builder_get_object(builder, "window1")); 
    image = GTK_WIDGET(gtk_builder_get_object(builder, "image1")); 

    /* Connect signals */ 
    gtk_builder_connect_signals(builder, image); 

    /* Destroy builder, since we don't need it anymore */ 
    g_object_unref(G_OBJECT(builder)); 

    /* Show window. All other widgets are automatically shown by GtkBuilder */ 
    gtk_widget_show(window); 

    /* Start main loop */ 
    gtk_main(); 

    return(0); 
} 

그리고는 해당 습지 파일입니다

<?xml version="1.0"?> 
<interface> 
    <requires lib="gtk+" version="2.16"/> 
    <!-- interface-naming-policy project-wide --> 
    <object class="GtkWindow" id="window1"> 
    <child> 
     <object class="GtkButton" id="button1"> 
     <property name="label" translatable="yes">button</property> 
     <property name="visible">True</property> 
     <property name="can_focus">True</property> 
     <property name="receives_default">True</property> 
     <property name="image">image1</property> 
     <signal name="clicked" handler="on_button1_clicked"/> 
     </object> 
    </child> 
    </object> 
    <object class="GtkImage" id="image1"> 
    <property name="visible">True</property> 
    <property name="pixbuf">icon1.png</property> 
    </object> 
</interface> 

그것을 실행하려면, 당신은 현재 디렉토리에 두 개의 파일, icon1.png 및 icon2.png을 넣어해야합니다.

추신. 글 레이드 파일을 게시하지 않으면 코드가하는 일을 정확히 알 수 없습니다. 또한 코드가 컴파일되지 않았으므로 정확히 작동하지 않는 부분을 말하면 좋을 것입니다.

관련 문제