Невозможно использовать xml-файл поляны с haskell

Я не уверен, должен ли я сказать привет или нет, поскольку это мой первый пост здесь.

В любом случае, я следую руководству по Glade с веб-сайта gtk2hs. Код скомпилирован правильно, но когда я пытаюсь его выполнить, я получаю эту ошибку.

(hellogtk2hs:8670): libglade-WARNING **: Expected <glade-interface>.  Got <interface>.
(hellogtk2hs:8670): libglade-WARNING **: did not finish in PARSER_FINISH state
hellogtk2hs: user error (Pattern match failure in do expression at HelloGtk2Hs.hs:8:8-15)

Это мой файл поляны.

<?xml version="1.0" encoding="UTF-8"?>
<interface>
  <!-- interface-requires gtk+ 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>
        <property name="homogeneous">True</property>
        <child>
          <object class="GtkLabel" id="label1">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="label" translatable="yes">Write your name here: </property>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">0</property>
          </packing>
        </child>
        <child>
          <object class="GtkEntry" id="entry1">
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="invisible_char">●</property>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">1</property>
          </packing>
        </child>
        <child>
          <object class="GtkBox" id="box2">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="homogeneous">True</property>
            <child>
              <object class="GtkButton" id="button1">
                <property name="label">gtk-apply</property>
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="receives_default">True</property>
                <property name="use_stock">True</property>
                <property name="always_show_image">True</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="button2">
                <property name="label">gtk-close</property>
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="receives_default">True</property>
                <property name="use_stock">True</property>
                <property name="always_show_image">True</property>
              </object>
              <packing>
                <property name="expand">False</property>
                <property name="fill">True</property>
                <property name="position">1</property>    
              </packing>
            </child>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">2</property>
          </packing>
        </child>
      </object>
    </child>
  </object>
</interface>

Файл Glade находится в том же каталоге, что и мой исходный код. Исходный код является точной копией кода в учебнике. Я никогда раньше не работал с Glade, поэтому понятия не имею, что происходит не так.

Мне пришлось понизить версию ghc с 7.6 до 7.4.2. Я использую Glade 3.14.1, все остальные пакеты были установлены через Cabal, поэтому они находятся в их текущей версии.

Если я переключаю interface на glade-interface, в начале и в конце он все еще жалуется.

(hellogtk2hs:9636): libglade-WARNING **: Unexpected element <object> inside <glade-interface>.
hellogtk2hs: user error (glade.xmlGetWidget: no object named "window1" in the glade file)

И если изменить все теги object с помощью widget, я получаю это

(hellogtk2hs:9668): GLib-GObject-ERROR **: cannot create instance of abstract (non-instantiatable) type `GtkBox'
`trap' para punto de parada/seguimiento

Я получаю меньше ошибок, делая это, но это все еще не работает.


person tokoro    schedule 08.11.2012    source источник
comment
Какие версии различных компонентов у вас есть?   -  person huon    schedule 08.11.2012
comment
Я думаю, проблема здесь: <!-- interface-requires gtk+ 3.0 -->; gtk2hs является привязкой gtk2.   -  person Matvey Aksenov    schedule 08.11.2012
comment
(Если вы нашли решение, вы должны указать его как ответ и принять его, чтобы вопрос не остался без ответа. Или @MatveyAksenov, вы можете оставить свой комментарий в качестве ответа.)   -  person huon    schedule 09.11.2012
comment
Поскольку я новый пользователь, мне нужно подождать еще два часа, прежде чем я смогу ответить на свой вопрос.   -  person tokoro    schedule 09.11.2012


Ответы (1)


Проблема заключалась в том, что gtk2hs не поддерживает gtk3, а файл, который я создавал, предназначался для gtk3.

Glade может генерировать либо файл libglade, либо файл gtkbuilder. Оба являются xml-файлами, и основное различие между ними заключается в том, что первый начинается с <glade-interface>, а второй — с <interface>. Также в файлах gtkbuilder используется тег <object> вместо тега <widget>.

Пакет Graphics.UI.Gtk.Glade использует файлы libglade, но проблема в том, что они устарели и объявлены устаревшими.

На странице загрузки Glade доступны две версии. Более новый из них создает файлы gtkbuilder, предназначенные для использования с gtk3, но, поскольку gtk2hs не поддерживает gtk3, вам придется загрузить версию 3.8, которая генерирует файлы libglade и gtkbuilder для gtk2.

Лучше всего перестать использовать файлы libglade и вместо этого использовать файлы gtkbuilder. Для этого вы должны импортировать Graphics.UI.Gtk.Builder вместо Graphics.UI.Gtk.Glade

Я нашел это руководство, которое использует gtkbuilder вместо libglade.

Эта программа создает окно с кнопкой, и каждый раз, когда вы нажимаете кнопку, вы будете получать «привет, мир» на своем терминале, пока окно не будет закрыто.

import Graphics.UI.Gtk
import Graphics.UI.Gtk.Builder

main = do
    initGUI
    builder <- builderNew
    builderAddFromFile builder "windowbuilder.glade"
    mainWindow <- builderGetObject builder castToWindow "main_window"
    onDestroy mainWindow mainQuit
    helloWorldButton <- builderGetObject builder castToButton "hello_world_button"
    onClicked helloWorldButton (putStrLn "Hello, World!")
    widgetShowAll mainWindow
    mainGUI

Это извлечение графического интерфейса из файла windowbuilder.glade. Я создал этот файл с помощью Glade-3. Вот.

<?xml version="1.0" encoding="UTF-8"?>
<interface>
  <requires lib="gtk+" version="2.24"/>
  <!-- interface-naming-policy project-wide -->
  <object class="GtkWindow" id="main_window">
    <property name="width_request">210</property>
    <property name="can_focus">False</property>
    <property name="title" translatable="yes">This is a window</property>
    <property name="resizable">False</property>
    <child>
      <object class="GtkVBox" id="vbox1">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <child>
          <object class="GtkLabel" id="label1">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="label" translatable="yes">Click the button!!</property>
          </object>
          <packing>
            <property name="expand">True</property>
            <property name="fill">True</property>
            <property name="position">0</property>
          </packing>
        </child>
        <child>
          <object class="GtkButton" id="hello_world_button">
            <property name="label">gtk-ok</property>
            <property name="use_action_appearance">False</property>
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="receives_default">True</property>
            <property name="border_width">7</property>
            <property name="use_stock">True</property>
          </object>
          <packing>
            <property name="expand">True</property>
            <property name="fill">True</property>
            <property name="padding">5</property>
            <property name="position">1</property>
          </packing>
        </child>
      </object>
    </child>
  </object>
</interface>

Еще одна веская причина для перехода на файлы gtkbuilder заключается в том, что пакет haskellglade не будет компилироваться с ghc >= 7.6.

person tokoro    schedule 09.11.2012