pygtk glade: perché questo semplice script non funziona?
Domanda
Ho scritto scrivendo una piccola applicazione pygtk usando glade per mettere insieme le interfacce utente. Ho già creato diverse finestre che funzionano, ma per qualche motivo questa non funziona. Ottengo il seguente traceback:
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
Ecco il contenuto di 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()
Ed ecco il file 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>
La cosa strana è che se estraggo la chiamata signal_autoconnect (auto), la finestra si apre. Ma se sostituisco quella chiamata con " self.on_TestClass_destroy (self, None, None) " restituisce invece la stessa eccezione NameError.
Non capisco davvero perché non funzioni, dato che ho creato molte altre classi di finestre che funzionano bene.
Il seguente codice funziona per chiunque qui?
Soluzione
Quel codice e la connessione finestra e segnale funzionano bene qui.
Tuttavia, c'è un piccolo bug quando si chiama il gestore del segnale. Il gestore del segnale non dovrebbe avere un argomento dati, poiché solo il widget viene passato come argomento.
def on_TestClass_destroy(self, widget):
gtk.main_quit()
Gli argomenti dei dati sono solo quelli forniti su connect nel caso in cui sia necessario uno stato extra per un gestore di segnale.