7

我不确定我是否应该打个招呼,这是我在这里的第一篇文章。

无论如何,我正在关注gtk2hs 网站上的 glade 教程。代码编译正确,但是当我尝试执行它时出现此错误。

(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">●&lt;/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 合作过,所以我不知道出了什么问题。

我不得不将 ghc 从 7.6 降级到 7.4.2。我正在使用 glade 3.14.1,所有其他软件包都是通过 cabal 安装的,因此它们使用的是当前版本。

如果我用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)

如果用小部件更改所有对象标签,我会得到这个

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

这样做我得到的错误更少,但它仍然不起作用。

4

1 回答 1

19

问题是 gtk2hs 不支持 gtk3,而我创建的文件是 gtk3 的。

Glade 可以生成 libglade 文件或 gtkbuilder 文件。两者都是xml文件,主要区别是前者以.<glade-interface>开头,后者以.开头<interface>。同样在 gtkbuilder 文件中,<object>使用标签而不是<widget>标签。

Graphics.UI.Gtk.Glade软件包使用 libglade 文件,问题是这些文件已过时且已弃用。

Glade 下载页面有两个版本可用。其中较新的版本会生成与 gtk3 一起使用的 gtkbuilder,但由于 gtk2hs 不支持 gtk3,因此您必须下载 3.8 版,它会为 gtk2 生成 libglade 和 gtkbuilder 文件。

最好的办法是停止使用 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。我使用 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 文件的另一个很好的理由是,haskell glade 包无法使用 ghc >= 7.6 进行编译。

于 2012-11-09T01:25:31.407 回答