2010-04-19 80 views
14

我在Glade 3.6.7中創建了一個簡單的窗口GUI,我試圖將它導入到Python中。每次我嘗試這樣做,我得到以下錯誤:Python Glade無法創建GladeXML對象

(queryrelevanceevaluation.py:8804): libglade-WARNING **: Expected <glade-interface>. Got <interface>. 

(queryrelevanceevaluation.py:8804): libglade-WARNING **: did not finish in PARSER_FINISH state 
Traceback (most recent call last): 
    File "queryrelevanceevaluation.py", line 17, in <module> 
    app = QueryRelevanceEvaluationApp() 
    File "queryrelevanceevaluation.py", line 10, in __init__ 
    self.widgets = gtk.glade.XML(gladefile) 
RuntimeError: could not create GladeXML object 

我的Python代碼:

#!/usr/bin/env python 

import gtk 
import gtk.glade 

class QueryRelevanceEvaluationApp: 

def __init__(self): 
    gladefile = "foo.glade" 
    self.widgets = gtk.glade.XML(gladefile) 
    dic = {"on_buttonGenerate_clicked" : self.on_buttonGenerate_clicked} 
    self.widgets.signal_autoconnect(dic) 

def on_buttonGenerate_clicked(self, widget): 
    print "You clicked the button" 

app = QueryRelevanceEvaluationApp() 
gtk.main() 

而且foo.glade文件:

<?xml version="1.0"?> 
<interface> 
<requires lib="gtk+" version="2.16"/> 
<!-- interface-naming-policy project-wide --> 
<object class="GtkWindow" id="windowRelevanceEvaluation"> 
<property name="visible">True</property> 
<property name="title" translatable="yes">Query Result Relevance Evaluation</property> 
<child> 
    <object class="GtkVBox" id="vbox1"> 
    <property name="visible">True</property> 
    <property name="orientation">vertical</property> 
    <child> 
     <object class="GtkHBox" id="hbox2"> 
     <property name="visible">True</property> 
     <child> 
      <object class="GtkLabel" id="labelQuery"> 
      <property name="visible">True</property> 
      <property name="label" translatable="yes">Query:</property> 
      </object> 
      <packing> 
      <property name="expand">False</property> 
      <property name="padding">4</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">&#x25CF;</property> 
      </object> 
      <packing> 
      <property name="padding">4</property> 
      <property name="position">1</property> 
      </packing> 
     </child> 
     </object> 
     <packing> 
     <property name="position">0</property> 
     </packing> 
    </child> 
    <child> 
     <object class="GtkFrame" id="frameSource"> 
     <property name="visible">True</property> 
     <property name="label_xalign">0</property> 
     <child> 
      <object class="GtkAlignment" id="alignment1"> 
      <property name="visible">True</property> 
      <property name="left_padding">12</property> 
      <child> 
       <object class="GtkHButtonBox" id="hbuttonbox1"> 
       <property name="visible">True</property> 
       <child> 
        <object class="GtkRadioButton" id="radiobuttonGoogle"> 
        <property name="label" translatable="yes">Google</property> 
        <property name="visible">True</property> 
        <property name="can_focus">True</property> 
        <property name="receives_default">False</property> 
        <property name="active">True</property> 
        <property name="draw_indicator">True</property> 
        </object> 
        <packing> 
        <property name="expand">False</property> 
        <property name="fill">False</property> 
        <property name="position">0</property> 
        </packing> 
       </child> 
       <child> 
        <object class="GtkRadioButton" id="radiobuttonBing"> 
        <property name="label" translatable="yes">Bing</property> 
        <property name="visible">True</property> 
        <property name="can_focus">True</property> 
        <property name="receives_default">False</property> 
        <property name="active">True</property> 
        <property name="draw_indicator">True</property> 
        </object> 
        <packing> 
        <property name="expand">False</property> 
        <property name="fill">False</property> 
        <property name="position">1</property> 
        </packing> 
       </child> 
       <child> 
        <object class="GtkRadioButton" id="radiobuttonBoden"> 
        <property name="label" translatable="yes">Boden</property> 
        <property name="visible">True</property> 
        <property name="can_focus">True</property> 
        <property name="receives_default">False</property> 
        <property name="active">True</property> 
        <property name="draw_indicator">True</property> 
        </object> 
        <packing> 
        <property name="expand">False</property> 
        <property name="fill">False</property> 
        <property name="position">2</property> 
        </packing> 
       </child> 
       <child> 
        <object class="GtkRadioButton" id="radiobuttonCSV"> 
        <property name="label" translatable="yes">CSV</property> 
        <property name="visible">True</property> 
        <property name="can_focus">True</property> 
        <property name="receives_default">False</property> 
        <property name="active">True</property> 
        <property name="draw_indicator">True</property> 
        </object> 
        <packing> 
        <property name="expand">False</property> 
        <property name="fill">False</property> 
        <property name="position">3</property> 
        </packing> 
       </child> 
       </object> 
      </child> 
      </object> 
     </child> 
     <child type="label"> 
      <object class="GtkLabel" id="labelFrameSource"> 
      <property name="visible">True</property> 
      <property name="label" translatable="yes">&lt;b&gt;Source&lt;/b&gt;</property> 
      <property name="use_markup">True</property> 
      </object> 
     </child> 
     </object> 
     <packing> 
     <property name="position">1</property> 
     </packing> 
    </child> 
    <child> 
     <object class="GtkFrame" id="frame1"> 
     <property name="visible">True</property> 
     <property name="label_xalign">0</property> 
     <child> 
      <object class="GtkHBox" id="hbox3"> 
      <property name="visible">True</property> 
      <child> 
       <object class="GtkLabel" id="labelResults"> 
       <property name="visible">True</property> 
       <property name="label" translatable="yes">Number Results:</property> 
       </object> 
       <packing> 
       <property name="expand">False</property> 
       <property name="position">0</property> 
       </packing> 
      </child> 
      <child> 
       <object class="GtkSpinButton" id="spinbuttonResults"> 
       <property name="visible">True</property> 
       <property name="can_focus">True</property> 
       <property name="invisible_char">&#x25CF;</property> 
       </object> 
       <packing> 
       <property name="padding">4</property> 
       <property name="position">1</property> 
       </packing> 
      </child> 
      </object> 
     </child> 
     <child type="label"> 
      <object class="GtkLabel" id="labelFrameResults"> 
      <property name="visible">True</property> 
      <property name="label" translatable="yes">&lt;b&gt;Results&lt;/b&gt;</property> 
      <property name="use_markup">True</property> 
      </object> 
     </child> 
     </object> 
     <packing> 
     <property name="padding">2</property> 
     <property name="position">2</property> 
     </packing> 
    </child> 
    <child> 
     <object class="GtkButton" id="buttonGenerateResults"> 
     <property name="label" translatable="yes">Generate!</property> 
     <property name="visible">True</property> 
     <property name="can_focus">True</property> 
     <property name="receives_default">True</property> 
     </object> 
     <packing> 
     <property name="position">3</property> 
     </packing> 
    </child> 
    </object> 
</child> 
</object> 
</interface> 

foo.glade和上面的python腳本都在同一個目錄下,並且我嘗試過使用完全限定的路徑,但仍然得到相同的錯誤(我確信路徑是正確的!)。

任何想法?

乾杯,

皮特

+0

gladefile的外觀如何?這是絕對路徑嗎?你確定你的程序可以訪問它嗎? – joaquin 2010-04-19 15:29:50

+0

我試過一個絕對路徑,只是「foo.glade」,發生了同樣的事情。在訪問文件時不應該有任何其他問題,它沒有特殊的文件限制,並且自從點擊Glade中的保存按鈕後我沒有觸及它。 – Peter 2010-04-19 15:34:41

回答

23

您已經創建了一個GtkBuilder文件,而不是格萊德文件。

您可以使用GtkBuilder如下:

builder = gtk.Builder() 
builder.add_from_string(string, len(string)) 
builder.connect_signals(anobject) 
builder.get_object(name) 

編輯

當您在林間空地開始一個新項目,它問你,如果你想創建一個林間空地文件或GtkBuilder文件,是新的和更靈活的。 嘗試建設者文件用下面的代碼:

#!/usr/bin/env python 

import gtk 

class QueryRelevanceEvaluationApp: 

    def __init__(self): 
     filename = "foo.glade" 
     builder = gtk.Builder() 
     builder.add_from_file(filename) 
     builder.connect_signals(self) 

    def on_buttonGenerate_clicked(self, widget): 
     print "You clicked the button" 

app = QueryRelevanceEvaluationApp() 
gtk.main() 

EDIT2:

當心,我看不到任何處理程序在你的GtkBuilder文件

+1

爲了使用上面的代碼,我需要創建什麼?使用Glade如何實現? (爲了完整):) – Peter 2010-04-19 16:10:45

+1

Peter:GtkBuilder是首選方法,使用libglade已棄用,所以,不要。 :-) – 2010-10-29 21:10:10

+0

有用的代碼片段,但它錯過了一個重要的步驟:builder.get_object(「windowRelevanceEvaluation」)。show_all() – 2012-06-06 00:36:49

5

我不得不提到皮特同樣的問題。在mg給出的答案後,我所做的就是將.glade文件保存爲liblgade格式而不是GTKBuilder。在另存爲...對話框的底部,您可以選擇「文件格式」,點擊「liblglade」,然後瞧!

+0

嗯......它沒有文件格式選項:/ – 2015-06-18 13:06:13