Michael Altfield
Michael Altfield

Reputation: 2787

NameError: class is not defined when overriding a class in python

Why can't python seem to find the InterfaceWithNoMenu class

class Settings(Screen):

        class SettingsWithNoMenu(kivy.uix.settings.SettingsWithNoMenu):

                def __init__(self, *args, **kwargs):
                        self.interface_cls = InterfaceWithNoMenu
                        kivy.uix.settings.SettingsWithNoMenu.__init__( self, *args, **kwargs )

        class InterfaceWithNoMenu(kivy.uix.settings.ContentPanel):
                def add_widget(self, widget):
                        if self.container is not None and len(self.container.children) > 0:
                                raise Exception(
                                'ContentNoMenu cannot accept more than one settings panel')
                        super(InterfaceWithNoMenu, self).add_widget(widget)
                        kivy.uix.settings.InterfaceWithNoMenu.__init__( self, *args, **kwargs )

        actionview = ObjectProperty(None)
        settings_content = ObjectProperty(None)

        def __init__(self, **kwargs):

                super(Settings, self).__init__(**kwargs)
...

I'm trying to change the look/feel/behaviour of the Settings module in a kivy-based python GUI app.

Unfortunately, when I create a settings window with the above program that creates an instance of the locally-overridden self.SettingsWithNoMenu class, I get the following error:

     self.interface_cls = InterfaceWithNoMenu
 NameError: name 'InterfaceWithNoMenu' is not defined

I don't understand. It's right there. I mean, the class InterfaceWithNoMenu is literally defined right underneath the one (SettingsWithNoMenu) that's referencing it.

Why can't the class SettingsWithNoMenu find InterfaceWithNoMenu? Why am I getting a NameError here?

Upvotes: 0

Views: 202

Answers (2)

Samwise
Samwise

Reputation: 71454

InterfaceWithNoMenu is defined in the namespace of the Settings class, not the global or local namespace. You should be able to do:

self.interface_cls = Settings.InterfaceWithNoMenu

since Settings is available in the global namespace.

Nested class definitions are a little awkward IMO and I would usually recommend not using them, especially if there's a dependency between "sibling" classes like this that requires the nested class to access its enclosing class.

Upvotes: 1

Noscere
Noscere

Reputation: 419

You're using the InterfaceWithNoMenu class before defining it, as you declare an instance of it in the SettingWithNoMenu class.

Can you swap those class definitions around and see if that fixes this error? (and you might need to make the reference more specific, with a self or a this or something)

Upvotes: 0

Related Questions