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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top