user8852560
user8852560

Reputation:

Cannot Bind Event Handler to Button

I creating a utility program in Python using wxPython, but I'm unable to bind a method to the button.

The interesting thing is, I've binded another button(self.add_employee_to_list) exactly the same way, but that one works.

class MyDialog(wx.Frame):

    def __init__(self, parent, title):
        self.no_resize = wx.DEFAULT_FRAME_STYLE & ~ (wx.RESIZE_BORDER | wx.MAXIMIZE_BOX)
        wx.Frame.__init__(self, parent, title=title, size=(500, 450),style = self.no_resize)

        self.panel = wx.Panel(self, size=(250, 270))

        self.add_employee_to_list = wx.Button(self.panel, label="Add Employee", pos=(250,50), size=(115,25))
        self.add_employee_to_list.Bind(wx.EVT_BUTTON, self.add_employee_to_box)

        #Button that produces error on binding
        self.remove_employee_from_list = wx.Button(self.panel, label="Remove Employee",pos= (250,80), size=(115,25))
        self.remove_employee_from_list.Bind(wx.EVT_BUTTON, self.remove_employee_from_list)


    def remove_employee_from_list(self, event):
        pass

app = wx.App(False)
frame = MyDialog(None, "Crystal Rose")
app.MainLoop()

I get the following error:

Traceback (most recent call last):   File "C:/Users/SR/PycharmProjects/CrystalRose/CrystalRoseGUI.py", line 59, in <module>
    frame = MyDialog(None, "Crystal Rose")   File "C:/Users/SR/PycharmProjects/CrystalRose/CrystalRoseGUI.py", line 22, in __init__
    self.remove_employee_from_list.Bind(wx.EVT_BUTTON, self.remove_employee_from_list)   File "C:\Program Files (x86)\Python36-32\lib\site-packages\wx\core.py", line 1339, in
_EvtHandler_Bind
    assert callable(handler) or handler is None AssertionError

Upvotes: 0

Views: 901

Answers (1)

LeopoldVonBuschLight
LeopoldVonBuschLight

Reputation: 911

You're declaring remove_employee_from_list as a method and also setting it as a button in __init__. The button and the method that fires aren't the same thing and need different names. Try this:

import wx

class MyDialog(wx.Frame):

    def __init__(self, parent, title):
        self.no_resize = wx.DEFAULT_FRAME_STYLE & ~ (wx.RESIZE_BORDER | wx.MAXIMIZE_BOX)
        wx.Frame.__init__(self, parent, title=title, size=(500, 450),style = self.no_resize)

        self.panel = wx.Panel(self, size=(250, 270))

        self.add_employee_to_list = wx.Button(self.panel, label="Add Employee", pos=(250,50), size=(115,25))
        self.add_employee_to_list.Bind(wx.EVT_BUTTON, self.add_employee_to_box)

        #Button that produces error on binding
        self.remove_employee_from_list = wx.Button(self.panel, label="Remove Employee",pos= (250,80), size=(115,25))
        self.remove_employee_from_list.Bind(wx.EVT_BUTTON, self.remove_employee_from_box) 


    def remove_employee_from_box(self, event):
        pass

    def add_employee_to_box(self, event):
        pass

app = wx.App(False)
frame = MyDialog(None, "Crystal Rose")
frame.Show()
app.MainLoop()

Upvotes: 1

Related Questions