2012-11-08 11 views
7

Nie jestem pewien, czy powinienem powiedzieć "cześć", czy nie, jako mój pierwszy post tutaj.Nie można użyć pliku xml z haszem z haskell

W każdym razie śledzę samouczek polany od gtk2hs website. Kod skompilowany poprawnie, ale kiedy próbuję go wykonać, otrzymuję ten błąd.

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

To jest mój plik polany.

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

Plik polany znajduje się w tym samym katalogu co mój kod źródłowy. Kod źródłowy jest dokładną kopią z tego w samouczku. Nigdy wcześniej nie pracowałem na polanie, więc nie mam pojęcia, co dzieje się źle.

Musiałem obniżyć ghc z 7,6 na 7.4.2. Używam polanki 3.14.1, wszystkie inne pakiety zostały zainstalowane za pomocą cabal, więc są na aktualnej wersji.

Gdybym przełączyć interfejsu z polanie interfejs, na początku i na końcu jeszcze narzeka.

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

A jeśli zmiana wszystkich obiektów tagi z widget uzyskać to

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

dostaję mniej błędów w ten sposób, ale nadal nie działa.

+0

Jakie są wersje różnych komponentów? – huon

+1

Zgaduję, że problem jest tutaj: ''; gtk2hs to powiązanie z gtk2. –

+0

(Jeśli znalazłeś rozwiązanie, powinieneś umieścić je jako odpowiedź i zaakceptować, aby pytanie nie pozostało bez odpowiedzi lub @MatveyAksenov, możesz umieścić swój komentarz jako odpowiedź.) – huon

Odpowiedz

19

Problem polegał na tym, że gtk2hs nie obsługuje gtk3, a plik, który tworzyłem, dotyczył gtk3.

Glade może generować plik libglade lub plik gtkbuilder. Oba są plikami xml, a główną różnicą między nimi jest to, że pierwsza zaczyna się od <glade-interface>, a później zaczyna się od <interface>. Również w plikach gtkbuilder jest używany znacznik <object> zamiast znacznika <widget>.

Pakiet Graphics.UI.Gtk.Glade korzysta z plików libglade, a problem polega na tym, że są one przestarzałe i przestarzałe.

Na Glade download page dostępne są dwie wersje. Nowszy z nich generuje gtkbuildery, które mają być używane z gtk3, ale ponieważ gtk2hs nie obsługuje gtk3, musisz pobrać wersję 3.8, która generuje zarówno pliki libglade, jak i gtkbuilder dla gtk2.

Najlepiej przestać używać plików libglade i używać plików gtkbuilder. Aby to zrobić, należy zaimportować Graphics.UI.Gtk.Builder zamiast Graphics.UI.Gtk.Glade

Znalazłem this tutorial, który używa gtkbuilder zamiast libglade.

Ten program tworzy okno z przyciskiem, a za każdym razem, gdy klikniesz przycisk, otrzymasz "witaj świecie" na swoim terminalu, dopóki okno nie zostanie zamknięte.

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 

To ciągnie gui z pliku windowbuilder.glade. Stworzyłem ten plik przy użyciu polany-3. Oto jest.

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

Kolejny dobry powód, aby przełączyć się gtkbuilder plików jest to, że pakiet polana Haskell nie będzie skompilować z GHC> = 7.6.

+1

Świetna odpowiedź; Dziękuję za to. – AndrewC

Powiązane problemy