Button Event Parameters missing?

I’ve attached my code below for a short example.
I have a menu that loads fine. When I click a button, it will one time print the queue/button name correctly, but crashes immediately after (without clicking again) and says:

I’ve tried attaching buttons and parameters to class members thinking maybe they were going out of scope, but no change… any insights would be nice.

:task(error) Exception Occured in PythonTask eventManager

…line 31, in appendMsg
queue.append(msg)
Type Error: append missing 1 required position argument: ‘msg’



from direct.showbase.ShowBase import ShowBase
import SSQueue

#WIND
from panda3d.core import WindowProperties
from direct.showbase.ShowBase import ShowBase
from direct.showbase.PythonUtil import Functor
from direct.gui.DirectGui import *

class SSMenu:
    def __init__(self,winW,winH):
        self.font = loader.loadFont("Fonts/Wbxkomik.ttf")
        self.buttonImages = (
            loader.loadTexture("UI/UIButton1.png"),
            loader.loadTexture("UI/UIButton1Pressed.png"),
            loader.loadTexture("UI/UIButton1Highlighted.png"),
            loader.loadTexture("UI/UIButton1Disabled.png")
        )       
        self.butW = self.buttonImages[0].getOrigFileXSize()
        self.butH = self.buttonImages[0].getOrigFileYSize()
        self.winW = winW
        self.winH = winH
        self.menu = None

    def appendMsg(self, queue, msg):
        print(queue)
        print(msg)
        queue.append(msg)
        
    def mainMenu(self,queue):
        self.buttons = ['Host','Join','Quit']
        self.queue = queue
        self.btn  = []

        if self.menu is None:
           self.menu = DirectDialog(frameSize = (-0.7, 0.7, -0.7, 0.7),
                                         fadeScreen = 0.4,
                                         relief = DGG.FLAT)

           dy = (self.butH / self.winH)
           for cnt in range(len(self.buttons)):
                self.btn.append(DirectButton(text = self.buttons[cnt],
                                   command = Functor(self.appendMsg, self.queue, self.buttons[cnt]),
                                   pos = (0, 0, 0.6 - cnt * dy),
                                   parent = self.menu,
                                   scale = 0.07,
                                   text_font = self.font,
                                   clickSound = loader.loadSfx("Sounds/UIClick.ogg"),
                                   frameTexture = self.buttonImages,
                                   frameSize = (-4, 4, -1, 1),
                                   text_scale = 0.75,
                                   relief = DGG.FLAT,
                                   text_pos = (0, -0.2)))
                self.btn[cnt].setTransparency(True)
                        
    def show(self):
        if self.menu.isHidden():
            self.menu.show()

class App(ShowBase):
    def __init__(self,winW,winH):
        ShowBase.__init__(self)
        self.disableMouse()
        props = WindowProperties()   
        props.setSize(winW,winH)
        self.win.requestProperties(props)
        self.queue = SSQueue
        self.menu = SSMenu(winW,winH)
        self.loadMain()
        
    def update(self, task):
        dt = globalClock.getDt()
        print(dt)

    def loadMain(self):
        self.menu.mainMenu(self.queue)
        self.menu.show()

    def quit(self):
        print('exit')
        base.userExit()

[SOLVED]
It was my own issue with my queue. My bad. Sorry guys. Is it better to delete or post full solution here?

I’d suggest posting the solution here–even if that solution is a simple matter, someone else might someday find it helpful.

But if you prefer to not do so, you can always just mark your own post a the solution, I think, and have done with it.

Well the issue was really a pythonic mistake.

#in some file SSQueue

class SSQueue:
#stuff

#in app
import SSQueue

#stuffs

class App:
    def  __init__(self):
        #stuff
        self.queue = SSQueue()  #<-- Does not create an object of type SSQueue.  
        #self.queue = SSQueue.SSQueue() one fix.  
       #however, I just changed import
      # -> from SSQueue import SSQueue


1 Like