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