Associating arguments to an event-handler function : Event « GUI Tk « Python






Associating arguments to an event-handler function

Associating arguments to an event-handler function
 
from Tkinter import *

class curry:
  """from Scott David Daniels'recipe 
  "curry -- associating parameters with a function"
  in the "Python Cookbook" 
  http://aspn.activestate.com/ASPN/Python/Cookbook/
  """

  def __init__(self, fun, *args, **kwargs):
    self.fun = fun
    self.pending = args[:]
    self.kwargs = kwargs.copy()

  def __call__(self, *args, **kwargs):
    if kwargs and self.kwargs:
      kw = self.kwargs.copy()
      kw.update(kwargs)
    else:
      kw = kwargs or self.kwargs
    return self.fun(*(self.pending + args), **kw)

def event_lambda(f, *args, **kwds ):
  """A helper function that wraps lambda in a prettier interface.
  Thanks to Chad Netzer for the code."""
  return lambda event, f=f, args=args, kwds=kwds : f( *args, **kwds )
# ---------- code for function: event_lambda (end) -----------
    
    
class MyApp:
  def __init__(self, parent):
    self.myParent = parent   
    self.myContainer1 = Frame(parent)
    self.myContainer1.pack()
    
    button_name = "OK"
    
    # command binding -- using curry
    self.button1 = Button(self.myContainer1,
       command = curry(self.buttonHandler, button_name, 1, "Good stuff!"))

    # event binding -- using the event_lambda helper function
    self.button1.bind("<Return>", 
      event_lambda( self.buttonHandler, button_name, 1, "Good stuff!" ) )
             
    self.button1.configure(text=button_name, background="green")  
    self.button1.pack(side=LEFT)
    self.button1.focus_force()  # Put keyboard focus on button1    
    
    
    button_name = "Cancel"
    
    # command binding -- using curry
    self.button2 = Button(self.myContainer1,
      command = curry(self.buttonHandler, button_name, 2, "Bad  stuff!"))
      
    # event binding -- using the event_lambda helper function in two steps
    event_handler = event_lambda( self.buttonHandler, button_name, 2, "Bad  stuff!" ) 
    self.button2.bind("<Return>", event_handler )
    
    self.button2.configure(text=button_name, background="red")
    self.button2.pack(side=LEFT)   

  
  def buttonHandler(self, argument1, argument2, argument3):   
    print "    buttonHandler routine received arguments:", \
      argument1.ljust(8), argument2, argument3
    
  def buttonHandler_a(self, event, argument1, argument2, argument3):
    print "buttonHandler_a received event", event
    self.buttonHandler(argument1, argument2, argument3)
    
root = Tk()
myapp = MyApp(root)
root.mainloop()
           
         
  








Related examples in the same category

1.Binding an event with an event handlerBinding an event with an event handler
2.Sharing Information Between Event-Handler FunctionsSharing Information Between Event-Handler Functions
3.What Events Does 'Command' Bind To?What Events Does 'Command' Bind To?
4.adds callbacks function to a buttonadds callbacks function to a button
5.Add system exit action to a buttonAdd system exit action to a button
6.Update Label in action event
7.Class wrapper for GUI
8.Use lambda to generate a call back function for a buttonUse lambda to generate a call back function for a button