Gtk+3 &C & Glade 问题
Gtk+3 &C & Glade problems
我试图在 Linux 上用 C 和 Glade 制作一个简单的 Gui 程序。
我写了一个简单的程序,用Glade设计了一个window。
当我 运行 代码时,它说:
(gtk-test:23026): Gtk-CRITICAL **: gtk_widget_show: assertion ‘GTK_IS_WIDGET(widget)’ failed
没有 Window 打开。
我在互联网上搜索了一下,但没有任何帮助。有人说我必须将 glade 文件转换为 .xml 但那没有用。
C
#include <gtk/gtk.h>
int main(int argc, char *argv[])
{
GtkBuilder *builder;
GtkWidget *window;
gtk_init(&argc, &argv);
builder = gtk_builder_new();
gtk_builder_add_from_file (builder, "window_main.glade", NULL);
window = GTK_WIDGET(gtk_builder_get_object(builder, "window_main"));
gtk_builder_connect_signals(builder, NULL);
g_object_unref(builder);
gtk_widget_show(window);
gtk_main();
return 0;
}
void on_window_main_destroy()
{
gtk_main_quit();
}
林间空地
<?xml version=1.0 encoding="UFT-8"?>
<!-- Generated with glade 3.18.3 -->
<interface>
<requires lib="gtk+" version="3.12"/>
<object class="GtkWindow" id="window_main">
<property name="can_focus">False</property>
<property name="title" translatable="yes">Test Window</property>
<property name="default_width">640</property>
<property name="default_height">480</property>
<signal name="destroy" handler="on_window_main_destroy" swapped="no"/>
<child>
<placeholder/>
</child>
</object>
</interface>
您似乎手动添加了 xml 标签,但它的格式不正确。同时,您没有对 gtk_builder_add_from_file
函数进行任何错误检查。
您的 xml 开头为:
<?xml version=1.0 encoding=UFT-8>
应该是:
<?xml version="1.0" encoding="UTF-8"?>
为避免这种情况,您应该使用 GError 并在使用 gtk_builder_add_from_file
.
解析构建器文件时检查是否存在错误
编辑:
我看到你更新了问题中的空地文件。如果您这样做,那么答案可能并不明显。无论如何,这是您的代码,其中包含检查空地文件是否存在的错误以及 @underscore_d
检查 GtkBuilder get_object
函数的提示(可以使用 g_assert
宏):
#include <gtk/gtk.h>
int main(int argc, char *argv[])
{
GError *err = NULL;
GtkBuilder *builder;
GtkWidget *window;
gtk_init(&argc, &argv);
builder = gtk_builder_new();
gtk_builder_add_from_file (builder, "window_main.glade", &err);
if (err != NULL) {
fprintf (stderr, "Unable to read file: %s\n", err->message);
g_error_free(err);
return 1;
}
window = GTK_WIDGET(gtk_builder_get_object(builder, "window_main"));
if (window == NULL || !GTK_IS_WINDOW(window)) {
fprintf (stderr, "Unable to get window. (window == NULL || window != GtkWindow)\n");
return 1;
}
gtk_builder_connect_signals(builder, NULL);
g_object_unref(builder);
gtk_widget_show(window);
gtk_main();
return 0;
}
void on_window_main_destroy(GtkWidget *widget, gpointer user_data)
{
gtk_main_quit();
}
编译:
gcc -rdynamic -o window main.c `pkg-config --cflags --libs gtk+-3.0`
我试图在 Linux 上用 C 和 Glade 制作一个简单的 Gui 程序。 我写了一个简单的程序,用Glade设计了一个window。 当我 运行 代码时,它说:
(gtk-test:23026): Gtk-CRITICAL **: gtk_widget_show: assertion ‘GTK_IS_WIDGET(widget)’ failed
没有 Window 打开。 我在互联网上搜索了一下,但没有任何帮助。有人说我必须将 glade 文件转换为 .xml 但那没有用。
C
#include <gtk/gtk.h>
int main(int argc, char *argv[])
{
GtkBuilder *builder;
GtkWidget *window;
gtk_init(&argc, &argv);
builder = gtk_builder_new();
gtk_builder_add_from_file (builder, "window_main.glade", NULL);
window = GTK_WIDGET(gtk_builder_get_object(builder, "window_main"));
gtk_builder_connect_signals(builder, NULL);
g_object_unref(builder);
gtk_widget_show(window);
gtk_main();
return 0;
}
void on_window_main_destroy()
{
gtk_main_quit();
}
林间空地
<?xml version=1.0 encoding="UFT-8"?>
<!-- Generated with glade 3.18.3 -->
<interface>
<requires lib="gtk+" version="3.12"/>
<object class="GtkWindow" id="window_main">
<property name="can_focus">False</property>
<property name="title" translatable="yes">Test Window</property>
<property name="default_width">640</property>
<property name="default_height">480</property>
<signal name="destroy" handler="on_window_main_destroy" swapped="no"/>
<child>
<placeholder/>
</child>
</object>
</interface>
您似乎手动添加了 xml 标签,但它的格式不正确。同时,您没有对 gtk_builder_add_from_file
函数进行任何错误检查。
您的 xml 开头为:
<?xml version=1.0 encoding=UFT-8>
应该是:
<?xml version="1.0" encoding="UTF-8"?>
为避免这种情况,您应该使用 GError 并在使用 gtk_builder_add_from_file
.
编辑:
我看到你更新了问题中的空地文件。如果您这样做,那么答案可能并不明显。无论如何,这是您的代码,其中包含检查空地文件是否存在的错误以及 @underscore_d
检查 GtkBuilder get_object
函数的提示(可以使用 g_assert
宏):
#include <gtk/gtk.h>
int main(int argc, char *argv[])
{
GError *err = NULL;
GtkBuilder *builder;
GtkWidget *window;
gtk_init(&argc, &argv);
builder = gtk_builder_new();
gtk_builder_add_from_file (builder, "window_main.glade", &err);
if (err != NULL) {
fprintf (stderr, "Unable to read file: %s\n", err->message);
g_error_free(err);
return 1;
}
window = GTK_WIDGET(gtk_builder_get_object(builder, "window_main"));
if (window == NULL || !GTK_IS_WINDOW(window)) {
fprintf (stderr, "Unable to get window. (window == NULL || window != GtkWindow)\n");
return 1;
}
gtk_builder_connect_signals(builder, NULL);
g_object_unref(builder);
gtk_widget_show(window);
gtk_main();
return 0;
}
void on_window_main_destroy(GtkWidget *widget, gpointer user_data)
{
gtk_main_quit();
}
编译:
gcc -rdynamic -o window main.c `pkg-config --cflags --libs gtk+-3.0`