views:

632

answers:

1

I've been writing writing a small pygtk application using glade to put together the UIs. I've created several windows already that work, but for some reason this one isn't working. I get the following 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

Here is the contents of 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()

And here is the glade file, 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>

The strange thing is that if I take out the signal_autoconnect(self) call, the window opens. But if I replace that call with "self.on_TestClass_destroy(self, None, None)" instead, it returns the same NameError exception.

I really don't understand why this isn't working, as I've created several other window classes that work fine.

Is the following code working for anyone here?

+2  A: 

That code and window and signal connection work fine here.

There is a small bug though when calling the signal handler. The signal handler should not have a data argument, since only the widget is passed as an argument.

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

The data argument(s) are only those provided on connect in case you need extra state for a signal handler.

Ali A
You're right about the small bug, thanks.
Adam Plumb
Does fixing that fix the call to autoconnect? it might have some magic in there for testing callback arguments.
Ali A