Search code examples
pythonclasswxpythoninstantiationinit

wxpython RuntimeError: super-class __init__() of type MainMenuBar was never called when instantiating class


I am trying to import MainMenuBar class from filemenu.py to my main class and instantiate it in my main class init method in wxPython but I am getting error

RuntimeError: super-class __init__() of type MainMenuBar was never called

Here is my main class

import os
import wx
from wx.lib.agw.scrolledthumbnail import ScrolledThumbnail, Thumb, PILImageHandler
import filemenu



class MainFrameImageThumbnail(wx.Frame):

    def __init__(self):
        wx.Frame.__init__(self, None, -1, "Mockup", size=(1200,800))
        
        self.scroll = ScrolledThumbnail(self, 10, size=(200,1200))
        self.panel = wx.Panel(self)
        self.scroll.SetBackgroundColour((5,5,5))
        font = wx.Font( wx.FontInfo(10).Bold())
        self.scroll.SetCaptionFont(font)
        self.scroll.SetThumbOutline(4)
        self.scroll.SetDropShadow(False)
        self.scroll.SetSelectionColour(wx.Colour(120,80,255))
        sizer = wx.BoxSizer(wx.VERTICAL)
        self.menuCreation()
        
    def menuCreation(self):
        mainMenu = filemenu.MainMenuBar()
app = wx.App(False)
frame = MainFrameImageThumbnail()

frame.Show(True)

app.MainLoop()

Here is my filemenu.py

import os
import wx


APP_EXIT = 1 

class MainMenuBar(wx.Panel):
    def __init__(self):

        self.FileTab()

    def OnQuit(self, e):
        self.Close()
    
    def FileTab(self):
        menubar = wx.MenuBar()
        fileMenu = wx.Menu()
        qmi = wx.MenuItem(fileMenu, APP_EXIT, '&Quit\tCtrl+Q')
        qmi.SetBitmap(wx.Bitmap('power-on.png'))
        fileMenu.Append(qmi)

        self.Bind(wx.EVT_MENU, self.OnQuit, id=APP_EXIT)

        menubar.Append(fileMenu, '&File')
        self.SetMenuBar(menubar)

Am I calling it wrong? Is there a specific way to do this in WxPython?

EDIT:

Following an example, I attempted this which looks more correct but I am getting another error

My main class:

import os
import wx
from wx.lib.agw.scrolledthumbnail import ScrolledThumbnail, Thumb, PILImageHandler
import filemenu



class MainFrameImageThumbnail(wx.Frame):

    def __init__(self):
        super().__init__(parent=None,title="Mockup", size=(1200,800))
        
        self.scroll = ScrolledThumbnail(self, 10, size=(200,1200))
        self.panel = wx.Panel(self)
        self.scroll.SetBackgroundColour((5,5,5))
        font = wx.Font( wx.FontInfo(10).Bold())
        self.scroll.SetCaptionFont(font)
        self.scroll.SetThumbOutline(4)
        self.scroll.SetDropShadow(False)
        self.scroll.SetSelectionColour(wx.Colour(120,80,255))
        sizer = wx.BoxSizer(wx.VERTICAL)
        self.menu = filemenu.MainMenuBar(self)        
        self.menu.FileTab()

app = wx.App(False)
frame = MainFrameImageThumbnail()

frame.Show(True)

app.MainLoop()

my filemenu.py

import os
import wx


APP_EXIT = 1 

class MainMenuBar(wx.Panel):
    def __init__(self,parent):
        super().__init__(parent)
    def OnQuit(self, e):
        self.Close()
    
    def FileTab(self):
        menubar = wx.MenuBar()
        fileMenu = wx.Menu()
        qmi = wx.MenuItem(fileMenu, APP_EXIT, '&Quit\tCtrl+Q')
        qmi.SetBitmap(wx.Bitmap('power-on.png'))
        fileMenu.Append(qmi)

        self.Bind(wx.EVT_MENU, self.OnQuit, id=APP_EXIT)

        menubar.Append(fileMenu, '&File')
        self.SetMenuBar(menubar)

Now I get this error:

AttributeError: 'MainMenuBar' object has no attribute 'SetMenuBar'

Solution

  • There is a lot going on in the filemenu.py, using a wx.Panel here in conjunction with a menu makes no sense. See what to change to make it work.

    New filemenu.py

    import os
    import wx
    
    
    APP_EXIT = 1 
    
    # using a wxPanel complicates stuff and is not necessary
    # class MainMenuBar(wx.Panel):
    class MainMenuBar:
        def __init__(self,parent):
            # we do no need to initialize parent class because there is none
            #super().__init__(parent)
            # instead we keep track of the parent frame we want
            # to integrate the menu bar into
            self.parent = parent
        def OnQuit(self, e):
            # adapt to who is parent
            self.parent.Close()
        
        def FileTab(self):
            menubar = wx.MenuBar()
            fileMenu = wx.Menu()
            qmi = wx.MenuItem(fileMenu, APP_EXIT, '&Quit\tCtrl+Q')
            qmi.SetBitmap(wx.Bitmap('power-on.png'))
            fileMenu.Append(qmi)
    
            # who is parent -> wx.Frame
            self.parent.Bind(wx.EVT_MENU, self.OnQuit, id=APP_EXIT)
    
            menubar.Append(fileMenu, '&File')
            # who is parent -> wx.Frame
            self.parent.SetMenuBar(menubar)