2012-11-08 24 views
7

Tôi không chắc mình có nên nói hay không, đây là bài đăng đầu tiên của tôi ở đây.Không thể sử dụng tệp glade xml với haskell

Dù sao, tôi đang theo dõi hướng dẫn thanh toán từ gtk2hs website. Mã được biên dịch đúng cách nhưng khi tôi cố thực hiện nó, tôi nhận được lỗi này.

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

Đây là tệp glade của tôi.

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

Tệp glade nằm trong cùng thư mục với mã nguồn của tôi. Mã nguồn là một bản sao chính xác từ một trong hướng dẫn. Tôi chưa bao giờ làm việc với glade trước đây, vì vậy tôi không có ý tưởng về những gì đang xảy ra.

Tôi phải hạ cấp ghc từ 7,6 xuống 7,4,2. Tôi đang sử dụng glade 3.14.1, tất cả các gói khác đã được cài đặt thông qua cabal để họ đang ở trên phiên bản hiện tại của họ.

Nếu tôi chuyển đổi giao diện bằng giao diện glade, lúc đầu và cuối cùng, nó vẫn than phiền.

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

Và nếu thay đổi tất cả các đối tượng thẻ với phụ tùng tôi có được điều này

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

tôi nhận được lỗi ít bằng cách thực hiện điều này, nhưng nó vẫn không hoạt động.

+0

Bạn có phiên bản nào của các thành phần khác nhau? – huon

+1

Tôi đoán vấn đề là ở đây: ''; gtk2hs là liên kết gtk2. –

+0

(Nếu bạn đã tìm thấy giải pháp, bạn nên đặt câu trả lời và chấp nhận giải pháp, để câu hỏi không được trả lời là chưa được trả lời. Hoặc @MatveyAksenov, bạn có thể đặt nhận xét của mình làm câu trả lời.) – huon

Trả lời

19

Vấn đề là gtk2hs không hỗ trợ gtk3 và tệp tôi đang tạo cho gtk3.

Glade có thể tạo tệp libglade hoặc tệp gtkbuilder. Cả hai đều là tệp xml và sự khác biệt chính giữa chúng là lần đầu tiên bắt đầu bằng <glade-interface> và sau đó bắt đầu bằng <interface>. Cũng trong các tệp gtkbuilder, thẻ <object> được sử dụng thay cho thẻ <widget>.

Gói Graphics.UI.Gtk.Glade sử dụng các tệp libglade và vấn đề là các lỗi này đã lỗi thời và không còn được dùng nữa.

Tại Glade download page có hai phiên bản có sẵn. Mới hơn trong số họ tạo ra gtkbuilders có nghĩa là để được sử dụng với gtk3, nhưng kể từ khi gtk2hs không hỗ trợ gtk3, bạn sẽ phải tải xuống phiên bản 3.8, tạo ra cả tệp libglade và gtkbuilder cho gtk2.

Điều tốt nhất cần làm là ngừng sử dụng tệp libglade và sử dụng tệp gtkbuilder thay thế. Để thực hiện điều này, bạn phải nhập Graphics.UI.Gtk.Builder thay vì Graphics.UI.Gtk.Glade

Tôi tìm thấy this tutorial sử dụng gtkbuilder thay vì libglade.

Chương trình này tạo cửa sổ bằng nút và mỗi khi bạn nhấp vào nút, bạn sẽ nhận được "hello world" trên thiết bị đầu cuối của mình cho đến khi cửa sổ đóng.

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 

Điều này kéo gui từ tệp windowbuilder.glade. Tôi đã tạo tập tin đó bằng glade-3. Đây rồi.

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

Một lý do khác để chuyển sang tệp gtkbuilder là gói chòm sao haskell sẽ không biên dịch với ghc> = 7.6.

+1

Câu trả lời hay; cảm ơn vì điều đó. – AndrewC

Các vấn đề liên quan