Events
Stephen Ferg
steve at ferg.org
Fri Nov 19 13:58:37 EST 2004
> Are there any really obvious things I should be doing with this code
You might want to think about defining an event class. There's a
cookbook recipe that addresses this kind of thing. It is at
http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/286136
I've been playing with a little program that I'm going to use in a
paper on event-driven programming. It uses an event-class. Also uses
a set rather than a list to hold the list of
observers/subscribers/listeners:
***************************************************************
import sets
class Dispatcher:
def __init__( self ):
# initialize a set of observers
# each observer includes the event-type that
# it wants to observer
self.myEventHandlers = sets.Set()
def registerHandler( self, argEventHandler, argEventType ):
self.myEventHandlers.add( (argEventHandler, argEventType) )
def eventArrival(self, argEvent):
# dispatch the event to the registered handlers
self.notifyEventHandlers(argEvent)
def notifyEventHandlers( self, argEvent):
for anEventHandler, anEventType in self.myEventHandlers:
if anEventType == argEvent.myEventType:
# if the observer is registered for this type of event...
anEventHandler.handle(argEvent) # ...send the event to it
class Event:
def __init__(self, argEventType, argEventSource):
self.myEventType = argEventType
self.myEventSource = argEventSource
class EventHandler:
def __init__(self, argHandlerName):
self.name = argHandlerName
def handle(self, argEvent ):
# for this simple example, all we do to handle
# the event is print information about it
print self.name , "is handling a", argEvent.myEventType, \
"event from" , argEvent.myEventSource
# create a dispatcher
demoDispatcher = Dispatcher()
# create some event handlers
demoHandler1 = EventHandler("Larry")
demoHandler2 = EventHandler("Moe ")
demoHandler3 = EventHandler("Curly")
# define an event type
demoEventType = "LeftMouseDoubleClick"
# register the event handlers for that type of event
demoDispatcher.registerHandler( demoHandler1, demoEventType )
demoDispatcher.registerHandler( demoHandler2, demoEventType )
demoDispatcher.registerHandler( demoHandler3, demoEventType )
# generate an actual event
demoEvent = Event(demoEventType, "mouse") # "mouse" is the event
source
# send the event to the dispatcher
demoDispatcher.eventArrival(demoEvent)
****************************************************************
More information about the Python-list
mailing list