# Copyright: (c) 2003 by db-X Corporation
# Licence: wxWindows license
#---------------------------------------------------------------------------
+# 12/02/2003 - Jeff Grimmett (grimmtooth@softhome.net)
+#
+# o Updated for 2.5 compatability.
+#
"""
A module that allows multiple handlers to respond to single wxWindows
This module is Python 2.1+ compatible.
"""
-from wxPython import wx
-import pubsub
+import wx
+import pubsub # publish / subscribe library
#---------------------------------------------------------------------------
# the natural way of doing things.)
if source is not None:
id = source.GetId()
+
if win is None:
# Some widgets do not function as their own windows.
win = self._determineWindow(source)
+
topic = (event, win, id)
# Create an adapter from the PS system back to wxEvents, and
"""
win = self._determineWindow(win)
topics = self.__getTopics(win)
+
if topics:
for aTopic in topics:
self.__deregisterTopic(aTopic)
+
del self.windowTopicLookup[win]
for topic in topicList:
topicDict = self.messageAdapterDict[topic]
+
if topicDict.has_key(listener):
topicDict[listener].Destroy()
del topicDict[listener]
+
if len(topicDict) == 0:
self.eventAdapterDict[topic].Destroy()
del self.eventAdapterDict[topic]
del self.messageAdapterDict[topic]
+
del self.listenerTopicLookup[listener]
name = aWin.GetClassName()
i = id(aWin)
return '%s #%d' % (name, i)
- except wx.wxPyDeadObjectError:
- return '(dead wxObject)'
+ except wx.PyDeadObjectError:
+ return '(dead wx.Object)'
def __topicString(self, aTopic):
# This topic isn't valid. Probably because it was deleted
# by listener.
return
+
for messageAdapter in messageAdapterList:
messageAdapter.Destroy()
+
self.eventAdapterDict[aTopic].Destroy()
del self.messageAdapterDict[aTopic]
del self.eventAdapterDict[aTopic]
def __getTopics(self, win=None):
if win is None:
return self.messageAdapterDict.keys()
+
if win is not None:
try:
return self.windowTopicLookup[win]
discovered, the implementation can be changed to a dictionary
lookup along the lines of class : function-to-get-window.
"""
- if isinstance(aComponent, wx.wxMenuItem):
+ if isinstance(aComponent, wx.MenuItem):
return aComponent.GetMenu()
else:
return aComponent
win = FakeWindow()
try:
eventMacro(win, None, None)
- except TypeError:
+ except (TypeError, AssertionError):
eventMacro(win, None)
self.lookupTable[eventMacro] = win.eventTypes
return win.eventTypes
try:
func(win, id, self.handleEvent)
self.callStyle = 3
- except TypeError:
+ except (TypeError, AssertionError):
func(win, self.handleEvent)
self.callStyle = 2
try:
if not self.disconnect():
print 'disconnect failed'
- except wx.wxPyDeadObjectError:
+ except wx.PyDeadObjectError:
print 'disconnect failed: dead object' ##????
if __name__ == '__main__':
- from wxPython.wx import wxPySimpleApp, wxFrame, wxToggleButton, wxBoxSizer, wxHORIZONTAL, EVT_MOTION, EVT_LEFT_DOWN, EVT_TOGGLEBUTTON, wxALL
- app = wxPySimpleApp()
- frame = wxFrame(None, -1, 'Event Test', size=(300,300))
- button = wxToggleButton(frame, -1, 'Listen for Mouse Events')
- sizer = wxBoxSizer(wxHORIZONTAL)
- sizer.Add(button, 0, 0 | wxALL, 10)
+ app = wx.PySimpleApp()
+ frame = wx.Frame(None, -1, 'Event Test', size=(300,300))
+ button = wx.ToggleButton(frame, -1, 'Listen for Mouse Events')
+ sizer = wx.BoxSizer(wx.HORIZONTAL)
+ sizer.Add(button, 0, 0 | wx.ALL, 10)
frame.SetAutoLayout(1)
frame.SetSizer(sizer)
# Turn the output of mouse events on and off
if event.IsChecked():
print '\nEnabling mouse events...'
- eventManager.Register(printEvent, EVT_MOTION, frame)
- eventManager.Register(printEvent, EVT_LEFT_DOWN, frame)
+ eventManager.Register(printEvent, wx.EVT_MOTION, frame)
+ eventManager.Register(printEvent, wx.EVT_LEFT_DOWN, frame)
else:
print '\nDisabling mouse events...'
eventManager.DeregisterWindow(frame)
# Send togglebutton events to both the on/off code as well
# as the function that prints to stdout.
- eventManager.Register(printEvent, EVT_TOGGLEBUTTON, button)
- eventManager.Register(enableFrameEvents, EVT_TOGGLEBUTTON, button)
+ eventManager.Register(printEvent, wx.EVT_TOGGLEBUTTON, button)
+ eventManager.Register(enableFrameEvents, wx.EVT_TOGGLEBUTTON, button)
frame.CenterOnScreen()
frame.Show(1)