无法用Gtk生成器加载进度文件.Gtk3 #

本文关键字:文件 Gtk3 加载 Gtk | 更新日期: 2023-09-27 18:18:05

(注意:这段代码不是我写的,它是从一个插件项目模板生成的)

当我尝试使用GTK Builder与GTK #来加载一个glade文件时,它抛出一个异常,该文件必须以元素开始。

错误:

GLib.GException has been thrown
Error on line 1 char 1: Document must begin with an element 
(e.g. <book>)

MainWindow.glade:

<?xml version="1.0" encoding="UTF-8"?>
<interface>
    <requires lib="gtk+" version="3.0" />
    <object class="GtkWindow" id="window1">
        <property name="can_focus">False</property>
        <child>
            <object class="GtkBox" id="box1">
                <property name="visible">True</property>
                <property name="can_focus">False</property>
                <property name="orientation">vertical</property>
                <child>
                    <object class="GtkLabel" id="label1">
                        <property name="visible">True</property>
                        <property name="can_focus">False</property>
                        <property name="yalign">0.47999998927116394</property>
                        <property name="label" translatable="yes">Hello World! This button has been clicked 0 time(s).</property>
                    </object>
                    <packing>
                        <property name="expand">False</property>
                        <property name="fill">True</property>
                        <property name="position">0</property>
                    </packing>
                </child>
                <child>
                    <object class="GtkButton" id="button1">
                        <property name="label" translatable="yes">Click me!</property>
                        <property name="visible">True</property>
                        <property name="can_focus">False</property>
                        <property name="receives_default">True</property>
                    </object>
                    <packing>
                        <property name="expand">False</property>
                        <property name="fill">True</property>
                        <property name="position">1</property>
                    </packing>
                </child>
            </object>
        </child>
    </object>
</interface>

MainWindow.cs:

using System;
using Gtk;
using UI = Gtk.Builder.ObjectAttribute;
public partial class MainWindow: Gtk.Window
{
    Builder builder;
    [UI] Gtk.Button button1;
    [UI] Gtk.Label label1;
    int clickedTimes;
    public static MainWindow Create ()
    {
        Builder builder = new Builder (null, "DiscordEditor.interfaces.MainWindow.glade", null);
        return new MainWindow (builder, builder.GetObject ("window1").Handle);
    }
    protected MainWindow (Builder builder, IntPtr handle) : base (handle)
    {
        this.builder = builder;
        builder.Autoconnect (this);
        DeleteEvent += OnDeleteEvent;
        button1.Clicked += onButtonClick;
    }
    protected void onButtonClick (object sender, EventArgs a)
    {
        clickedTimes++;
        label1.Text = string.Format ("Hello World! This button has been clicked {0} time(s).", clickedTimes);
    }
    protected void OnDeleteEvent (object sender, DeleteEventArgs a)
    {
        Application.Quit ();
        a.RetVal = true;
    }
}

我不明白为什么会发生这种情况,除非这是GTK#3的错误,因为它还没有完全发布。我真的很想用GTK3而不是GTK2,所以有人会建议什么?

编辑:我修复了它通过打开生成的文件,并保存在GTKBuilder格式。

无法用Gtk生成器加载进度文件.Gtk3 #

我在外部修改glade文件时也有同样的错误。这是因为我使用了一个缓冲区,我将其归零,并且没有正确设置实际文件大小。我不认为这很重要,但正确设置eof修复了错误。不确定你的情况是否相同(多年后这并不重要),但也许是由于类似的原因。似乎是gtk的glade reader不是很健壮的一个bug。

为我修复了一个类似的问题,将.glade文件的内容复制到一个具有新名称的文件中,并将该文件加载到代码中。我无法解释为什么这行得通,但它确实行得通。