2012-01-23 6 views
6

Tôi đang bắt đầu với Gtk +, tôi đang làm theo hướng dẫn này cách tạo ứng dụng đầu tiên, nhưng khi tôi thử chạy tệp thực thi, tôi gặp lỗi này:Gtk-Critical **: gtk_widget_show xác nhận GTK_IS_WIDGET (WIDGET)

Gtk-Critical **: gtk_widget_show assertion GTK_IS_WIDGET(WIDGET) 

tôi có thể nhìn thấy trên google có rất nhiều người với cùng một lỗi, nhưng tôi không thể nhìn thấy câu trả lời với làm thế nào để sửa lỗi này ..

C Mã của tôi:

#include <stdlib.h> 
#include <gtk/gtk.h> 

GtkBuilder *builder; 
GtkWidget *app; 

G_MODULE_EXPORT 
void on_app_destroy (void) 
{ 
gtk_main_quit(); 
} 

G_MODULE_EXPORT 
void on_menu_quit_activate (void) 
{ 
gtk_main_quit(); 
exit(EXIT_SUCCESS); 
} 

int main (int argc, char *argv[]) 
{ 
/* Initialize GTK+ */ 
g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING, (GLogFunc) gtk_false, NULL); 
gtk_init (&argc, &argv); 
g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING, g_log_default_handler, NULL); 

builder = gtk_builder_new(); 
gtk_builder_add_from_file (builder, "tut.glade", NULL); 
app = GTK_WIDGET (gtk_builder_get_object (builder, "app")); 
gtk_builder_connect_signals (builder, NULL); 

g_object_unref (G_OBJECT (builder)); 

/* Enter the main loop */ 
gtk_widget_show (app); 
gtk_main(); 
return 0; 
} 

vui file:

<?xml version="1.0"?> 
<glade-interface> 
    <!-- interface-requires gtk+ 2.16 --> 
    <!-- interface-naming-policy project-wide --> 
    <widget class="GtkWindow" id="window1"> 
    <child> 
     <widget class="GtkFixed" id="fixed1"> 
     <property name="visible">True</property> 
     <child> 
      <widget class="GtkButton" id="button1"> 
      <property name="label" translatable="yes">button</property> 
      <property name="width_request">113</property> 
      <property name="height_request">42</property> 
      <property name="visible">True</property> 
      <property name="can_focus">True</property> 
      <property name="receives_default">True</property> 
      </widget> 
      <packing> 
      <property name="x">149</property> 
      <property name="y">69</property> 
      </packing> 
     </child> 
     </widget> 
    </child> 
    </widget> 
    <widget class="GtkWindow" id="window2"> 
    <child> 
     <placeholder/> 
    </child> 
    </widget> 
</glade-interface> 

tùy chọn biên dịch:

`pkg-config --cflags --libs gtk+-2.0` -export-dynamic 

thiết lập Linker:

-export-dynamic 

IDE của tôi: Code :: Blocks, biên dịch: GNUC C Compiler

Làm thế nào để sửa lỗi này? Cảm ơn trước.

Trả lời

8

Vấn đề là không có đối tượng có id là app trong tệp glade của bạn. Nếu bạn muốn hiển thị cửa sổ, bạn phải chuyển id được liên kết với cửa sổ, tức là window1. Vì vậy bạn mã có thể được thay đổi để:

app = GTK_WIDGET (gtk_builder_get_object (builder, "window1")); 
if (NULL == app) 
{ 
    /* Print out the error. You can use GLib's message logging */ 
    fprintf(stderr, "Unable to file object with id \"window1\" \n"); 
    /* Your error handling code goes here */ 
} 

Có vài gợi ý khác:
1. Nó là tốt hơn để sử dụng GError ** tham số trong gtk_builder_add_from_file gọi. Vì vậy, thay vì chỉ gtk_builder_add_from_file sử dụng đoạn mã sau đây để bạn tham khảo:

GError *err = NULL; /* It is mandatory to initialize to NULL */ 
... 
if(0 == gtk_builder_add_from_file (builder, "tut.glade", &err)) 
{ 
    /* Print out the error. You can use GLib's message logging */ 
    fprintf(stderr, "Error adding build from file. Error: %s\n", err->message); 
    /* Your error handling code goes here */ 
} 
... 

2. Từ tập tin glade của bạn, phần tử gốc glade-interface chỉ ra rằng bạn đang sử dụng định dạng libglade để lưu tập tin bạn glade thay vì định dạng GtkBuilder. Vì vậy, bạn có thể cần phải liên kết libglade trong bản dựng. Nhưng từ tệp glade bạn chỉ ra rằng phiên bản Gtk là 2.16 trở lên, bạn có thể cần phải sử dụng định dạng GtkBuilder. Trong trường hợp đó, bạn sẽ cần phải chuyển đổi sang định dạng GtkBuilder có thể được thực hiện bằng cách sử dụng tập lệnh gtk-builder-convert hoặc mở tệp glade trong ứng dụng Glade & lưu ở định dạng GtkBuilder (Tùy chọn này sẽ tùy thuộc vào phiên bản Glade của bạn).
Hy vọng điều này sẽ hữu ích!

+1

Rất nhiều! chúc một ngày tốt lành :) – Jack