2010-04-19 17 views
14

He creado una GUI de ventana simple en Glade 3.6.7 y estoy tratando de importarla a Python. Cada vez que trato de hacer lo que me sale el siguiente error:Python Glade no pudo crear el objeto 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 

Código Mi 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() 

y el archivo 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 y la encima de la secuencia de comandos de python están en el mismo directorio, y he intentado utilizar una ruta totalmente calificada, pero aún así obtener el mismo error (¡estoy seguro de que la ruta es correcta!).

¿Alguna idea?

Saludos,

Pete

+0

¿Cómo se ve gladefile exactamente? ¿Es un camino absoluto? ¿Estás seguro de que tu programa puede acceder? – joaquin

+0

He intentado un camino absoluto y simplemente "foo.glade" y sucedió lo mismo. No debe haber ningún otro problema al acceder al archivo, no tiene restricciones de archivos especiales y no lo he tocado desde que presioné el botón Guardar en Glade. – Peter

Respuesta

23

Ha creado un archivo GtkBuilder en lugar de archivo de Glade.

Puede utilizar GtkBuilder de la siguiente manera:

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

EDITAR:

Al iniciar un nuevo proyecto en claro que le pregunta si desea crear un archivo de claro o un archivo GtkBuilder, que es nuevo y más flexible. Pruebe el archivo constructor con el siguiente código:

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

Mira que no puedo ver ningún controlador en el archivo de GtkBuilder

+1

¿Qué tendría que crear para usar el código anterior y cómo se logra esto usando Glade? (Solo para completar) :) – Peter

+1

Peter: GtkBuilder es el método preferido, el uso de libglade está obsoleto, por lo tanto, no. :-) –

+0

Fragmento de código útil, pero omitió un paso importante: builder.get_object ("windowRelevanceEvaluation"). Show_all() –

5

que tenía el mismo problema Pete mencionó. Después de la respuesta que dio mg, lo que hice fue guardar el archivo .glade en un formato liblgade en lugar de GTKBuilder. En el cuadro de diálogo Guardar como ..., en la parte inferior tiene la opción "Formato de archivo", haga clic en "liblglade" y listo !!!!

+0

Hm ... No tiene la opción de formato de archivo: / –

Cuestiones relacionadas