Gtk-ERROR **: не удалось добавить интерфейс: ошибка в строке 1, символ 1: документ должен начинаться с элемента
Почему GTK+ 3 выбрасывает эту ошибку?
(.:11977): Gtk-ERROR **: 21:10:01.149: failed to add UI: Errore alla riga 1 carattere 1: Il documento deve iniziare con un elemento (es. <book>)
Перевод с итальянского на английский:
(.:11977): Gtk-ERROR **: 21:10:01.149: failed to add UI: Error on line 1 char 1: Document must begin with an element (e.g. <book>)
Ошибка говорит о том, что Rust пытается открыть файл (созданный с помощью Glade), который пуст или его синтаксис неверен.
Мой Rust файл компилируется без ошибок:
extern crate gtk;
use gtk::traits::*;
use gtk::Builder;
use gtk::Inhibit;
fn main() {
// Initialise gtk components
if gtk::init().is_err() {
println!("Unable to load GTK.");
return;
}
// Load glade file
let builder = Builder::new_from_string("mainWindow.glade");
// Create Window
let window: gtk::Window = builder.get_object("mainWindow").unwrap();
// Set close event
window.connect_delete_event(|_, _| {
gtk::main_quit();
Inhibit(true)
});
// Show the window and call the main() loop of gtk
window.show_all();
gtk::main();
}
Файл Glade:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.1 -->
<interface>
<requires lib="gtk+" version="3.20"/>
<!-- interface-css-provider-path style.css -->
<object class="GtkWindow" id="mainWindow">
<property name="can_focus">False</property>
<property name="window_position">center</property>
<property name="default_width">500</property>
<property name="default_height">350</property>
<child type="titlebar">
<object class="GtkHeaderBar">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="title" translatable="yes">rustup-gui</property>
<property name="subtitle" translatable="yes">A simple GUI for rustup.</property>
<property name="show_close_button">True</property>
<child>
<object class="GtkMenuBar">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkMenuItem">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="tooltip_text" translatable="yes">Here you can find some basic action which can be done with rustup.</property>
<property name="label" translatable="yes">Rustup</property>
<property name="use_underline">True</property>
<child type="submenu">
<object class="GtkMenu">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkMenuItem">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="tooltip_text" translatable="yes">Get all the info related to the current rustup installation.</property>
<property name="label" translatable="yes">Info</property>
<property name="use_underline">True</property>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkMenuItem">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Set...</property>
<property name="use_underline">True</property>
<child type="submenu">
<object class="GtkMenu">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkMenuItem">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Default toolchain</property>
<property name="use_underline">True</property>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkCheckButton">
<property name="label" translatable="yes">Vervose output (-v)</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="draw_indicator">True</property>
<signal name="toggled" handler="tglVerbose_Toggled" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_left">5</property>
<property name="margin_right">5</property>
<property name="margin_top">5</property>
<property name="margin_bottom">5</property>
<property name="label" translatable="yes">Custom command</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkEntry">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="margin_left">5</property>
<property name="margin_right">5</property>
<property name="margin_top">5</property>
<property name="margin_bottom">5</property>
<property name="placeholder_text" translatable="yes">rustup ...</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkFrame">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_left">5</property>
<property name="margin_right">5</property>
<property name="margin_top">5</property>
<property name="margin_bottom">5</property>
<property name="label_xalign">0.5</property>
<property name="shadow_type">in</property>
<child>
<object class="GtkAlignment">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkTextView" id="txtOutput">
<property name="width_request">100</property>
<property name="height_request">130</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="margin_left">5</property>
<property name="margin_right">5</property>
<property name="margin_top">5</property>
<property name="margin_bottom">5</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
<property name="editable">False</property>
<property name="monospace">True</property>
</object>
</child>
</object>
</child>
<child type="label">
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Console output</property>
</object>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</interface>
( Глейд файл)
Я пытался найти эту ошибку, но, похоже, никто, кроме меня, не сталкивался с этой неловкой ошибкой. Может быть, это связано с моей ОС? Я использую Pop!_OS, дистрибутив Linux на основе Ubuntu, созданный System76.
2 ответа
Функция gtk::Builder::new_from_string()
ожидает строку с полным содержимым XML, а не именем файла. Вы проходите "mainWindow.glade"
это неверный синтаксис XML, поэтому вы получаете ошибку (в строке 1, потому что вы написали только одну строку).
Вы хотите позвонить:
Builder::new_from_file("mainWindow.glade")
PS: Приятной особенностью компилятора Rust является то, что вы можете включать файлы в виде буквенных строк, поэтому вы можете написать:
Builder::new_from_string(include_str!("mainWindow.glade"))
и вы скомпилируете содержимое файла в программу.
Как и у меня возникла такая же проблема при попытке отредактировать XML-файл GUI в Visual Studio 2017 или текстовых редакторах и поместить XML-файлы GUI для его запуска.
Способ исправить это:
Создайте свой GUI от Glade и сохраните (рекомендуется формат файла GtkBuilder), как вам нужно.
Замените имя файла, которое вы сохранили в 1.
2.1 C#, new_from_file("ваше имя файла")
2.1 C++, gtk_builder_add_from_file(...., "имя вашего файла", ....)
ты так счастлив!