7

初めての投稿なので、挨拶すべきかどうか迷っています。

とにかく、私はgtk2hs websiteからのグレードのチュートリアルに従っています。コードは適切にコンパイルされましたが、実行しようとするとこのエラーが発生します。

(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>

グレード ファイルは、ソース コードと同じディレクトリにあります。ソース コードは、チュートリアルのものからの正確なコピーです。私はこれまで空き地で作業したことがないので、何がうまくいかないのかわかりません。

ghc を 7.6 から 7.4.2 にダウングレードする必要がありました。私はグレード 3.14.1 を使用しています。他のすべてのパッケージは cabal 経由でインストールされているため、現在のバージョンになっています。

インターフェースを切り替えると、最初と最後にまだ文句を言います。

(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のダウンロード ページには、2 つのバージョンが用意されています。新しいものは gtk3 で使用することを意図した gtkbuilder を生成しますが、gtk2hs は gtk3 をサポートしていないため、gtk2 用の libglade と gtkbuilder ファイルの両方を生成するバージョン 3.8 をダウンロードする必要があります。

最善の方法は、libglade ファイルの使用をやめ、代わりに gtkbuilder ファイルを使用することです。Graphics.UI.Gtk.Builderこれを行うには、代わりにインポートする必要がありますGraphics.UI.Gtk.Glade

libglade の代わりに gtkbuilder を使用するこのチュートリアルを見つけました。

このプログラムはボタン付きのウィンドウを作成し、ボタンをクリックするたびに、ウィンドウが閉じられるまで端末に「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 ファイルに切り替えるもう 1 つの正当な理由は、haskell グレード パッケージが ghc >= 7.6 でコンパイルされないことです。

于 2012-11-09T01:25:31.407 に答える