2011-08-13 6 views
0

Glade-3을 사용하고 있습니다. 그런 다음Gtk에서 오류 받기. 이유가 뭐야?

<?xml version="1.0"?> 
<interface> 
    <requires lib="gtk+" version="2.16"/> 
    <!-- interface-naming-policy project-wide --> 
    <object class="GtkListStore" id="liststore1"/> 
    <object class="GtkWindow" id="Home"> 
    <property name="destroy_with_parent">True</property> 
    <signal name="destroy" handler="gtk_main_quit"/> 
    <child> 
     <object class="GtkVBox" id="vbox1"> 
     <property name="visible">True</property> 
     <property name="orientation">vertical</property> 
     <child> 
      <object class="GtkHBox" id="hbox1"> 
      <property name="visible">True</property> 
      <child> 
       <object class="GtkScrolledWindow" id="scrolledwindow1"> 
       <property name="visible">True</property> 
       <property name="can_focus">True</property> 
       <property name="hscrollbar_policy">automatic</property> 
       <property name="vscrollbar_policy">automatic</property> 
       <child> 
        <object class="GtkTreeView" id="treeview2"> 
        <property name="visible">True</property> 
        <property name="can_focus">True</property> 
        <property name="model">liststore1</property> 
        </object> 
       </child> 
       </object> 
       <packing> 
       <property name="position">0</property> 
       </packing> 
      </child> 
      <child> 
       <object class="GtkVButtonBox" id="vbuttonbox2"> 
       <property name="visible">True</property> 
       <property name="orientation">vertical</property> 
       <property name="spacing">2</property> 
       <property name="layout_style">center</property> 
       <child> 
        <object class="GtkButton" id="button1"> 
        <property name="label">gtk-goto-top</property> 
        <property name="visible">True</property> 
        <property name="can_focus">True</property> 
        <property name="receives_default">True</property> 
        <property name="use_stock">True</property> 
        </object> 
        <packing> 
        <property name="expand">False</property> 
        <property name="fill">False</property> 
        <property name="position">0</property> 
        </packing> 
       </child> 
       <child> 
        <object class="GtkButton" id="button2"> 
        <property name="label">gtk-go-up</property> 
        <property name="visible">True</property> 
        <property name="can_focus">True</property> 
        <property name="receives_default">True</property> 
        <property name="use_stock">True</property> 
        </object> 
        <packing> 
        <property name="expand">False</property> 
        <property name="fill">False</property> 
        <property name="position">1</property> 
        </packing> 
       </child> 
       <child> 
        <object class="GtkButton" id="button3"> 
        <property name="label">gtk-add</property> 
        <property name="visible">True</property> 
        <property name="can_focus">True</property> 
        <property name="receives_default">True</property> 
        <property name="use_stock">True</property> 
        </object> 
        <packing> 
        <property name="expand">False</property> 
        <property name="fill">False</property> 
        <property name="position">2</property> 
        </packing> 
       </child> 
       <child> 
        <object class="GtkButton" id="button4"> 
        <property name="label">gtk-remove</property> 
        <property name="visible">True</property> 
        <property name="can_focus">True</property> 
        <property name="receives_default">True</property> 
        <property name="use_stock">True</property> 
        </object> 
        <packing> 
        <property name="expand">False</property> 
        <property name="fill">False</property> 
        <property name="position">3</property> 
        </packing> 
       </child> 
       <child> 
        <object class="GtkButton" id="button5"> 
        <property name="label">gtk-go-down</property> 
        <property name="visible">True</property> 
        <property name="can_focus">True</property> 
        <property name="receives_default">True</property> 
        <property name="use_stock">True</property> 
        </object> 
        <packing> 
        <property name="expand">False</property> 
        <property name="fill">False</property> 
        <property name="position">4</property> 
        </packing> 
       </child> 
       <child> 
        <object class="GtkButton" id="button6"> 
        <property name="label">gtk-goto-bottom</property> 
        <property name="visible">True</property> 
        <property name="can_focus">True</property> 
        <property name="receives_default">True</property> 
        <property name="use_stock">True</property> 
        </object> 
        <packing> 
        <property name="expand">False</property> 
        <property name="fill">False</property> 
        <property name="position">5</property> 
        </packing> 
       </child> 
       </object> 
       <packing> 
       <property name="position">1</property> 
       </packing> 
      </child> 
      <child> 
       <object class="GtkVBox" id="vbox2"> 
       <property name="visible">True</property> 
       <property name="orientation">vertical</property> 
       <child> 
        <object class="GtkViewport" id="viewport1"> 
        <property name="visible">True</property> 
        <property name="resize_mode">queue</property> 
        <child> 
         <object class="GtkAlignment" id="alignment1"> 
         <property name="width_request">0</property> 
         <property name="height_request">0</property> 
         <property name="visible">True</property> 
         <property name="xscale">0</property> 
         <property name="yscale">0</property> 
         <child> 
          <object class="GtkFrame" id="frame1"> 
          <property name="visible">True</property> 
          <property name="label_xalign">0</property> 
          <property name="shadow_type">in</property> 
          <child> 
           <object class="GtkDrawingArea" id="drawingarea1"> 
           <property name="width_request">300</property> 
           <property name="height_request">200</property> 
           <property name="visible">True</property> 
           </object> 
          </child> 
          <child type="label_item"> 
           <placeholder/> 
          </child> 
          </object> 
         </child> 
         </object> 
        </child> 
        </object> 
        <packing> 
        <property name="position">0</property> 
        </packing> 
       </child> 
       <child> 
        <object class="GtkHButtonBox" id="hbuttonbox1"> 
        <property name="visible">True</property> 
        <property name="spacing">2</property> 
        <property name="homogeneous">True</property> 
        <property name="layout_style">center</property> 
        <child> 
         <object class="GtkCheckButton" id="checkbutton2"> 
         <property name="label" translatable="yes">Show points</property> 
         <property name="visible">True</property> 
         <property name="can_focus">True</property> 
         <property name="receives_default">False</property> 
         <property name="draw_indicator">True</property> 
         </object> 
         <packing> 
         <property name="expand">False</property> 
         <property name="fill">False</property> 
         <property name="position">0</property> 
         </packing> 
        </child> 
        <child> 
         <object class="GtkCheckButton" id="checkbutton1"> 
         <property name="label" translatable="yes">Show lines</property> 
         <property name="visible">True</property> 
         <property name="can_focus">True</property> 
         <property name="receives_default">False</property> 
         <property name="draw_indicator">True</property> 
         </object> 
         <packing> 
         <property name="expand">False</property> 
         <property name="fill">False</property> 
         <property name="position">1</property> 
         </packing> 
        </child> 
        </object> 
        <packing> 
        <property name="expand">False</property> 
        <property name="position">1</property> 
        </packing> 
       </child> 
       </object> 
       <packing> 
       <property name="position">2</property> 
       </packing> 
      </child> 
      </object> 
      <packing> 
      <property name="position">1</property> 
      </packing> 
     </child> 
     <child> 
      <object class="GtkStatusbar" id="statusbar1"> 
      <property name="visible">True</property> 
      <property name="spacing">2</property> 
      </object> 
      <packing> 
      <property name="expand">False</property> 
      <property name="pack_type">end</property> 
      <property name="position">0</property> 
      </packing> 
     </child> 
     </object> 
    </child> 
    </object> 
</interface> 

내가 tut.c로 명명 된 C 프로그램을 만들어 : 나는 이름 tut.glade으로 프로젝트를 저장하고 텍스트 편집기에서 파일을 열 enter image description here

, 여기의 코드입니다 :이 도구를 만들어 그때 컴파일

#include <gtk/gtk.h> 

int 
main(int argc, 
     char **argv) 
{ 
    GtkBuilder *builder; 
    GtkWidget *window; 
    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.glade" with your saved project. */ 
    if(! gtk_builder_add_from_file(builder, "tut.glade", &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")); 

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

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

를 사용하여 다음 코드를 가지고있는 gcc -o tut tut.c $(pkg-config --cflags --libs gtk+-2.0 gmodule-2.0)

그러면 실행 파일의 이름은 tut입니다. 나는

./tut

를 사용하여 실행하고 나는이 오류 가지고 :

(tut:19516): Gtk-CRITICAL **: gtk_widget_show: assertion `GTK_IS_WIDGET (widget)' failed 
+1

'g_free'가 아닌'g_error_free'를 사용하여 오류를 해소하십시오! – ptomato

답변

3

당신은 "window1"라는 이름의 객체를 요구하고를하지만 tut.glade 파일처럼 아무것도 없다. 어쩌면 window에 NULL 검사가 너무 좋은 생각 일 것입니다

window = GTK_WIDGET(gtk_builder_get_object(builder, "Home")); 

및이와

window = GTK_WIDGET(gtk_builder_get_object(builder, "window1")); 

:

<object class="GtkWindow" id="Home"> 

그래서이 교체하려고 : 그 XML에 하나의 창이있다 .

+0

죄송합니다. 어리석은 실수. –

+0

@Chankey : 때때로 그것은 명백한 것을보기 위해 신선한 눈을 맞 춥니 다 :) –

+0

예 :) 한 가지 물어보고 싶습니다. Perl에서 C로 작성한 것과 비슷한 코드를 만들 수 있습니까? –