Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

wxpython pass variable to callback event. Lambda land

Am I not understanding something about lambdas? Or GetValue() the variable that I am trying to pass is empty. Is it best to just create a global palletNumberText for this? In createWidgets() I am binding an EVT_TEXT so that when text is entered into the TextCtrl it should call onPalletNumberText(event, variable_here)

The following line is where I am having difficulties:

palletNumberText.Bind(wx.EVT_TEXT, lambda event, temp_str=palletNumberText.GetValue(): self.onPalletNumberText( event, temp_str ))

Inside this Code Snippet:

class ClassName(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title=title)
        self.panel = wx.Panel(self)
        self.PhotoMaxSize = 240
        self.createWidgets()
        self.Show()

    def createWidgets(self):
        .
        .
        .
        palletNumberText = wx.TextCtrl(self.panel, size=(80,-1))
        # THIS LINE
        palletNumberText.Bind(wx.EVT_TEXT, lambda event, temp_str=palletNumberText.GetValue(): self.onPalletNumberText( event, temp_str ))
        .
        .
        .

    def onPalletNumberText(self, event, palletNumber):
        '''
        save palletNumbertTxt Value when text is entered
        '''
        print palletNumber
        print "This is a test"
        # Store Value

        return

Readings that I have looked at:

  • wxpython, passing data to a function in self.Bind
  • http://wiki.wxpython.org/Passing%20Arguments%20to%20Callbacks
  • wxpython passing information, pointers?
  • How can I give variables to the event handler?
  • Is it possible to pass arguments into event bindings?
  • http://wxpython-users.1045709.n5.nabble.com/GetValue-from-TextCtrl-by-hitting-a-button-td3203210.html
  • Getting String from A TextCtrl Box

However my results:

results

Thanks.

like image 706
jmunsch Avatar asked Mar 06 '26 06:03

jmunsch


1 Answers

your default argument is evaluated at start time

lambda event, temp_str=None: self.onPalletNumberText( event, 
                             temp_str if temp_str is not None else palletNumberText.GetValue() )

I think would work

but what you really want is probably something more like

lambda event, txt_instance=palletNumberText: self.onPalletNumberText( event, txt_instance.GetValue() )  
like image 116
Joran Beasley Avatar answered Mar 08 '26 18:03

Joran Beasley