不能使用Haskell的一块空地xml文件(Can't use a glade xml fi

2019-08-02 12:01发布

我不知道我是否应该说是喜还是不行,这里是这个我的第一篇文章。

无论如何,我下面从林间空地教程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>

林间空地文件在同一目录作为我的源代码。 的源代码是从所述一个教程的精确副本。 我从来没有与林间空地工作过,所以我没有什么走错了的想法。

我不得不降级GHC从7.6到7.4.2。 我使用的空地3.14.1,所有其他的包都通过小集团安装,以便他们对自己的当前版本。

如果我切换界面空地接口 ,在开始和结束时仍然抱怨。

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

如果改变所有对象的标签与插件我得到这个

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

我做这个得到更少的错误,但它仍然无法正常工作。

Answer 1:

问题是,gtk2hs不支持gtk3,我是创建该文件是为gtk3。

格莱德能够产生或者是libglade的文件或文件gtkbuilder。 两者都是XML文件,并且它们之间的主要区别在于,该第一开始于<glade-interface>和与后来的开始<interface> 。 此外,在文件gtkbuilder所述<object>标签被用来代替<widget>标记。

Graphics.UI.Gtk.Glade包利用了libglade的文件,问题是,这是过时的和不提倡使用。

在格莱德下载页面有两个可用的版本。 他们的新生成为了与gtk3使用gtkbuilders,但由于gtk2hs不支持gtk3,你必须下载3.8版,它同时产生libglade的和gtkbuilder文件GTK2。

做的最好的事情就是停止使用libglade的文件,并使用gtkbuilder文件,而不是。 要做到这一点,你必须导入Graphics.UI.Gtk.Builder代替Graphics.UI.Gtk.Glade

我发现这个教程它利用gtkbuilder而不是libglade的的。

这个程序创建一个按钮的窗口,每按一次按钮,您会在终端上得到一个“Hello World”,直到窗口关闭。

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文件拉动GUI。 我创建利用林间空地-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文件是Haskell的空地包将不会与GHC> = 7.6编译。



文章来源: Can't use a glade xml file with haskell