2012-11-08 11 views
7

verwenden Ich bin mir nicht sicher, ob ich hallo oder nicht sagen sollte, dies ist mein erster Beitrag hier.Kann nicht eine HTML-Datei mit Haskell

Wie auch immer, ich folge der Lichtung Tutorial aus der gtk2hs website. Der Code kompiliert korrekt, aber wenn ich versuche, es auszuführen, erhalte ich diesen Fehler.

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

Dies ist meine Lichtung Datei.

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

Die Datei Lichtung befindet sich im selben Verzeichnis wie mein Quellcode. Der Quellcode ist eine exakte Kopie aus dem Tutorial. Ich habe noch nie zuvor mit der Lichtung gearbeitet, also habe ich keine Ahnung, was falsch läuft.

Ich musste ghc von 7,6 auf 7,4.2 herunterstufen. Ich benutze glade 3.14.1, alle anderen Pakete wurden via cabal installiert, so dass sie auf ihrer aktuellen Version sind.

Wenn ich Schnittstelle mit Glade-Schnittstelle, am Anfang und am Ende schalten Sie es noch beschwert.

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

Und wenn ändern alle Objekt Tags mit Widget ich dieses

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

ich weniger Fehler erhalten, indem dies zu tun, aber es funktioniert immer noch nicht.

+0

Welche Versionen der verschiedenen Komponenten haben Sie? – huon

+1

Ich denke, das Problem ist hier: ''; gtk2hs ist gtk2-Bindung. –

+0

(Wenn Sie eine Lösung gefunden haben, sollten Sie es als Antwort setzen und akzeptieren, damit die Frage nicht unbeantwortet bleibt. Oder @MatveyAksenov, könnten Sie Ihren Kommentar als Antwort setzen.) – huon

Antwort

19

Das Problem war, dass gtk2hs gtk3 nicht unterstützt, und die Datei, die ich erstellt habe, war für gtk3.

Glade kann entweder eine libglade-Datei oder eine gtkbuilder-Datei generieren. Beide sind XML-Dateien, und der Hauptunterschied zwischen ihnen ist, dass der erste mit <glade-interface> beginnt und der spätere mit <interface> beginnt. Auch in Gtkbuilder-Dateien wird das <object>-Tag anstelle des <widget>-Tags verwendet.

Das Graphics.UI.Gtk.Glade-Paket verwendet die libglade-Dateien und das Problem ist, dass diese veraltet und veraltet sind.

Bei der Glade download page sind zwei Versionen verfügbar. Der neuere von ihnen erzeugt gtkbuilders, die mit gtk3 verwendet werden sollen, aber da gtk2hs gtk3 nicht unterstützt, müssen Sie Version 3.8 herunterladen, die sowohl libglade- als auch gtkbuilder-Dateien für gtk2 generiert.

Die beste Sache zu tun ist, zu stoppen, libglade Dateien zu benutzen und die gtkbuilder Akten stattdessen zu benutzen. Um dies zu tun, müssen Sie Graphics.UI.Gtk.Builder anstelle von Graphics.UI.Gtk.Glade

importieren Ich fand this tutorial, die gtkbuilder statt libglade verwendet.

Dieses Programm erstellt ein Fenster mit einer Schaltfläche, und jedes Mal, wenn Sie auf die Schaltfläche klicken, erhalten Sie eine "Hallo Welt" auf Ihrem Terminal, bis das Fenster geschlossen wird.

Dies zieht die GUI aus der windowbuilder.glade Datei. Ich habe diese Datei mit glade-3 erstellt. Hier ist es.

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

Ein weiterer guter Grund zu wechseln, um Dateien zu gtkbuilder ist, dass das haskell lichtung Paket mit ghc nicht> = 7.6 kompiliert.

+1

Große Antwort; Dank dafür. – AndrewC