pregunta de pygtk glade: ¿por qué no funciona este simple script?
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í?
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.