2012-11-08 9 views
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">●</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 तक डाउनग्रेड करना पड़ा। मैं glade 3.14.1 का उपयोग कर रहा हूं, अन्य सभी पैकेज कैबल के माध्यम से स्थापित किए गए थे ताकि वे अपने वर्तमान संस्करण पर हों।

अगर मैं Glade इंटरफ़ेस साथ स्विच इंटरफ़ेस, शुरुआत में और अंत यह अभी भी शिकायत पर।

(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 

मैं ऐसा करने से कम त्रुटियों मिल पाने लेकिन यह अभी भी काम नहीं करता।

+0

आपके पास विभिन्न घटकों के कौन से संस्करण हैं? – huon

+1

मुझे लगता है कि समस्या यहां है: ''; gtk2hs gtk2 बाध्यकारी है। –

+0

(यदि आपको कोई समाधान मिल गया है, तो आपको इसे उत्तर के रूप में रखना चाहिए और इसे स्वीकार करना चाहिए, ताकि प्रश्न अनुत्तरित के रूप में नहीं छोड़ा जा सके। या @MatveyAksenov, आप अपनी टिप्पणी को उत्तर के रूप में डाल सकते हैं।) – huon

उत्तर

19

समस्या यह थी कि gtk2hs gtk3 का समर्थन नहीं करता है, और जो फ़ाइल मैं बना रहा था वह gtk3 के लिए था।

ग्लैड या तो एक libglade फ़ाइल या gtkbuilder फ़ाइल उत्पन्न कर सकते हैं। दोनों एक्सएमएल फाइलें हैं, और उनके बीच मुख्य अंतर यह है कि पहली बार <glade-interface> के साथ शुरू होता है और बाद में <interface> के साथ शुरू होता है। Gtkbuilder फ़ाइलों में <object> टैग का उपयोग <widget> टैग के बजाय किया जाता है।

Graphics.UI.Gtk.Glade पैकेज libglade फ़ाइलों का उपयोग करता है, और समस्या यह है कि ये अप्रचलित और बहिष्कृत हैं।

Glade download page पर दो संस्करण उपलब्ध हैं। उनमें से नया gtkbuilders को gtk3 के साथ उपयोग करने के लिए उत्पन्न करता है, लेकिन चूंकि gtk2hs gtk3 का समर्थन नहीं करता है, इसलिए आपको संस्करण 3.8 डाउनलोड करना होगा, जो gtk2 के लिए libglade और gtkbuilder फ़ाइलों दोनों उत्पन्न करता है।

सबसे अच्छी बात यह है कि libglade फ़ाइलों का उपयोग करना बंद करें और इसके बजाय gtkbuilder फ़ाइलों का उपयोग करें। ऐसा करने के लिए आपको Graphics.UI.Gtk.Glade

के बजाय Graphics.UI.Gtk.Builder आयात करना होगा this tutorial जो मुझे libglade के बजाय gtkbuilder का उपयोग करता है।

यह प्रोग्राम एक बटन के साथ एक विंडो बनाता है, और हर बार जब आप बटन पर क्लिक करते हैं तो आपको विंडो बंद होने तक आपके टर्मिनल पर "हैलो वर्ल्ड" मिल जाएगी।

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 

यह विंडोबिल्डर.ग्लैड फ़ाइल से गुई खींच रहा है। मैंने उस फ़ाइल को ग्लैड -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 के साथ संकलन नहीं होगा।

+1

ग्रेट उत्तर; उसके लिए धन्यवाद। – AndrewC