0

Python 2.7

Ubuntu 12.04

My code is available here.

I'm trying to put together a base for myself to make creating wxPython apps easier, I'm using the set up of my last program as that base but it's not working properly.

The problem arises when I try to bind a button to a function, this is the same layout that has worked for me before but now when I try to start the program with the button and the bind in place I get this error:

AttributeError: 'my_panel' object has no attribute 'on_quit'

If I remove the bind the program launches.

What's going on?

I've looked at other questions regarding this and it seems that most of the time it's a typing error, I've looked but I cannot find one.

1 Answer 1

1

The on_quit method in your code is indented too far. It needs to be at the same indention level as the init function. This is what you have:

def __init__(self, parent):
    """docstring for __"""
    wx.Panel.__init__(self, parent)
    self.frame = parent

    self.main_sizer = wx.BoxSizer(wx.VERTICAL)
    self.widget_sizer = wx.BoxSizer(wx.VERTICAL)

    self.text_object = wx.StaticText(self, -1, 'Example')
    self.button_object = wx.Button(self, -1, 'QUIT')
    self.button_object.Bind(wx.EVT_BUTTON, self.on_quit)

    self.widget_sizer.Add(self.text_object, 0)
    self.widget_sizer.Add(self.button_object, 0)

    self.main_sizer.Add(self.widget_sizer, 0)


    def on_quit(self, event):
        """docstring for on"""
        self.Close()

This is what it should look like:

def __init__(self, parent):
    """docstring for __"""
    wx.Panel.__init__(self, parent)
    self.frame = parent

    self.main_sizer = wx.BoxSizer(wx.VERTICAL)
    self.widget_sizer = wx.BoxSizer(wx.VERTICAL)

    self.text_object = wx.StaticText(self, -1, 'Example')
    self.button_object = wx.Button(self, -1, 'QUIT')
    self.button_object.Bind(wx.EVT_BUTTON, self.on_quit)

    self.widget_sizer.Add(self.text_object, 0)
    self.widget_sizer.Add(self.button_object, 0)

    self.main_sizer.Add(self.widget_sizer, 0)


def on_quit(self, event):
    """docstring for on"""
    self.Close()

Also note that "self.Close()" will not work. It should be self.frame.Close()

Sign up to request clarification or add additional context in comments.

1 Comment

That did it, not sure why I totally missed that.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.