Pregunta

He estado escribiendo escribiendo una pequeña aplicación pygtk usando glade para juntar las IU. Ya he creado varias ventanas que funcionan, pero por alguna razón esta no funciona. Recibo el siguiente rastreo:

Traceback (most recent call last):
  File "test.py", line 7, in <module>
    class TestClass:
  File "test.py", line 10, in TestClass
    self.wTree.signal_autoconnect(self)
NameError: name 'self' is not defined

Aquí está el contenido de test.py:

#!/usr/bin/env python

import pygtk
import gtk
import gtk.glade

class TestClass:
    def __init__(self):
        self.wTree = gtk.glade.XML("test.glade")
        self.wTree.signal_autoconnect(self)

    def on_TestClass_destroy(self, widget, data):
        gtk.main_quit()

if __name__ == "__main__":
    window = TestClass()
    gtk.main()

Y aquí está el archivo glade, test.glade:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
<!--Generated with glade3 3.4.5 on Fri Nov 21 08:53:53 2008 -->
<glade-interface>
  <widget class="GtkWindow" id="TestWindow">
    <property name="visible">True</property>
    <property name="title" translatable="yes">Test Window</property>
    <signal name="destroy" handler="on_TestClass_destroy"/>
    <child>
      <placeholder/>
    </child>
  </widget>
</glade-interface>

Lo extraño es que si elimino la llamada signal_autoconnect (self), se abre la ventana. Pero si reemplazo esa llamada con " self.on_TestClass_destroy (self, None, None) " en su lugar, devuelve la misma excepción NameError.

Realmente no entiendo por qué esto no funciona, ya que he creado varias otras clases de ventanas que funcionan bien.

¿Funciona el siguiente código para alguien aquí?

¿Fue útil?

Solución

Ese código y la conexión de ventana y señal funcionan bien aquí.

Sin embargo, hay un pequeño error al llamar al controlador de señal. El controlador de señal no debe tener un argumento de datos, ya que solo el widget se pasa como argumento.

def on_TestClass_destroy(self, widget):
    gtk.main_quit()

Los argumentos de datos son solo los proporcionados en connect en caso de que necesite un estado adicional para un controlador de señal.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top