2010-04-19 2 views
14

J'ai créé une interface graphique simple dans Glade 3.6.7 et j'essaie de l'importer en Python. Chaque fois que j'essaie de le faire, je l'erreur suivante:Python Glade n'a pas pu créer l'objet 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 

Mon Python code:

#!/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() 

Et le fichier 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 et la Au-dessus de script Python sont dans le même répertoire, et j'ai essayé d'utiliser un chemin qualifié complet, mais toujours la même erreur (je suis certain que le chemin est correct!).

Des idées?

Cheers,

Pete

+0

Comment ressemble exactement gladefile? Est-ce un chemin absolu? Êtes-vous sûr que votre programme peut y accéder? – joaquin

+0

J'ai essayé un chemin absolu et juste "foo.glade" et la même chose s'est produite. Il ne devrait pas y avoir d'autres problèmes pour accéder au fichier, il n'y a pas de restrictions spéciales sur les fichiers et je ne l'ai pas touché depuis que j'ai appuyé sur le bouton Enregistrer dans Glade. – Peter

Répondre

23

Vous avez créé un fichier GtkBuilder au lieu de fichier Glade.

Vous pouvez utiliser GtkBuilder comme suit:

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

EDIT:

Lorsque vous démarrez un nouveau projet dans Glade il vous demande si vous voulez créer un fichier Glade ou un fichier GtkBuilder, qui est nouveau et plus flexible. Essayez le fichier constructeur avec le code suivant:

#!/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:

Prenez garde que je ne vois aucun gestionnaire dans votre fichier GtkBuilder

+1

Que devrais-je créer pour utiliser le code ci-dessus et comment cela est-il réalisé en utilisant Glade? (Juste pour l'exhaustivité) :) – Peter

+1

Peter: GtkBuilder est la méthode préférée, en utilisant libglade est dépréciée, donc, ne le faites pas. :-) –

+0

Extrait de code utile, mais il a manqué une étape importante: builder.get_object ("windowRelevanceEvaluation"). Show_all() –

5

J'ai eu le même problème Pete mentionné. Après la réponse que mg a donné, ce que j'ai fait est de sauvegarder le fichier .glade dans un format liblgade au lieu de GTKBuilder. Dans la boîte de dialogue Enregistrer sous .., en bas, vous avez l'option "Format de fichier", cliquez sur "liblglade" et voila !!!!

+0

Hm ... Il n'a pas l'option de format de fichier: / –