Revision: 5831
          http://matplotlib.svn.sourceforge.net/matplotlib/?rev=5831&view=rev
Author:   dmkaplan
Date:     2008-07-24 10:02:13 +0000 (Thu, 24 Jul 2008)

Log Message:
-----------
Moving "event loop" stuff from blocking_input.py to backends.  For backends
without a GUI, the default is to throw a NotImplemented error.  For backends
with a GUI, I have implemented a "start/stop_event_loop_default" that does
the default event loop using time.sleep.  For WX, I have used the code
supplied by Paul Kienzle, but I have been unable to check it because that
backend currently doesn't work for me.

Modified Paths:
--------------
    trunk/matplotlib/lib/matplotlib/backend_bases.py
    trunk/matplotlib/lib/matplotlib/backends/backend_cocoaagg.py
    trunk/matplotlib/lib/matplotlib/backends/backend_fltkagg.py
    trunk/matplotlib/lib/matplotlib/backends/backend_gtk.py
    trunk/matplotlib/lib/matplotlib/backends/backend_qt.py
    trunk/matplotlib/lib/matplotlib/backends/backend_qt4.py
    trunk/matplotlib/lib/matplotlib/backends/backend_tkagg.py
    trunk/matplotlib/lib/matplotlib/backends/backend_wx.py
    trunk/matplotlib/lib/matplotlib/blocking_input.py

Modified: trunk/matplotlib/lib/matplotlib/backend_bases.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backend_bases.py    2008-07-24 08:50:43 UTC 
(rev 5830)
+++ trunk/matplotlib/lib/matplotlib/backend_bases.py    2008-07-24 10:02:13 UTC 
(rev 5831)
@@ -23,7 +23,7 @@
 """
 
 from __future__ import division
-import os, warnings
+import os, warnings, time
 
 import numpy as np
 import matplotlib.cbook as cbook
@@ -1391,7 +1391,76 @@
         """
         raise NotImplementedError
 
+    def start_event_loop(self,*args,**kwargs):
+        """
+        Start an event loop.  This is used to start a blocking event
+        loop so that interactive functions, such as ginput and
+        waitforbuttonpress, can wait for events.  This should not be
+        confused with the main GUI event loop, which is always running
+        and has nothing to do with this.
 
+        This is implemented only for backends with GUIs.
+        """
+        raise NotImplementedError
+
+    def stop_event_loop(self,*args,**kwargs):
+        """
+        Stop an event loop.  This is used to stop a blocking event
+        loop so that interactive functions, such as ginput and
+        waitforbuttonpress, can wait for events.
+
+        This is implemented only for backends with GUIs.
+        """
+        raise NotImplementedError
+
+    def start_event_loop_default(self,timeout=0):
+        """
+        Start an event loop.  This is used to start a blocking event
+        loop so that interactive functions, such as ginput and
+        waitforbuttonpress, can wait for events.  This should not be
+        confused with the main GUI event loop, which is always running
+        and has nothing to do with this.
+
+        This function provides default event loop functionality based
+        on time.sleep that is meant to be used until event loop
+        functions for each of the GUI backends can be written.  As
+        such, it throws a deprecated warning.
+
+        Call signature::
+
+        start_event_loop_default(self,timeout=0)
+
+        This call blocks until a callback function triggers
+        stop_event_loop() or *timeout* is reached.  If *timeout* is
+        <=0, never timeout.
+        """
+        str = "Using default event loop until function specific"
+        str += " to this GUI is implemented"
+        warnings.warn(str,DeprecationWarning)
+
+        if timeout <= 0: timeout = np.inf
+        timestep = 0.01
+        counter = 0
+        self._looping = True
+        while self._looping and counter*timestep < timeout:
+            self.flush_events()
+            time.sleep(timestep)
+            counter += 1
+
+    def stop_event_loop_default(self):
+        """
+        Stop an event loop.  This is used to stop a blocking event
+        loop so that interactive functions, such as ginput and
+        waitforbuttonpress, can wait for events.
+
+        Call signature::
+
+        stop_event_loop_default(self)
+        """
+        self._looping = False
+
+
+
 class FigureManagerBase:
     """
     Helper class for matlab mode, wraps everything up into a neat bundle

Modified: trunk/matplotlib/lib/matplotlib/backends/backend_cocoaagg.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backends/backend_cocoaagg.py        
2008-07-24 08:50:43 UTC (rev 5830)
+++ trunk/matplotlib/lib/matplotlib/backends/backend_cocoaagg.py        
2008-07-24 10:02:13 UTC (rev 5831)
@@ -58,6 +58,16 @@
     def blit(self, bbox):
         pass
 
+    def start_event_loop(self,*args,**kwargs):
+        FigureCanvasBase.start_event_loop_default(self,*args,**kwargs)
+    start_event_loop.__doc__=FigureCanvasBase.start_event_loop_default.__doc__
+
+    def stop_event_loop(self,*args,**kwargs):
+        FigureCanvasBase.stop_event_loop_default(self,*args,**kwargs)
+    stop_event_loop.__doc__=FigureCanvasBase.stop_event_loop_default.__doc__
+
+
+
 NibClassBuilder.extractClasses('Matplotlib.nib', mplBundle)
 
 class MatplotlibController(NibClassBuilder.AutoBaseClass):

Modified: trunk/matplotlib/lib/matplotlib/backends/backend_fltkagg.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backends/backend_fltkagg.py 2008-07-24 
08:50:43 UTC (rev 5830)
+++ trunk/matplotlib/lib/matplotlib/backends/backend_fltkagg.py 2008-07-24 
10:02:13 UTC (rev 5831)
@@ -247,6 +247,14 @@
     def widget(self):
         return self.canvas
 
+    def start_event_loop(self,*args,**kwargs):
+        FigureCanvasBase.start_event_loop_default(self,*args,**kwargs)
+    start_event_loop.__doc__=FigureCanvasBase.start_event_loop_default.__doc__
+
+    def stop_event_loop(self,*args,**kwargs):
+        FigureCanvasBase.stop_event_loop_default(self,*args,**kwargs)
+    stop_event_loop.__doc__=FigureCanvasBase.stop_event_loop_default.__doc__
+
 def destroy_figure(ptr,figman):
     figman.window.hide()
     Gcf.destroy(figman._num)
@@ -491,7 +499,7 @@
     default_filetype = base.canvas.get_default_filetype()
     sorted_filetypes = filetypes.items()
     sorted_filetypes.sort()
-    
+
     selected_filter = 0
     filters = []
     for i, (ext, name) in enumerate(sorted_filetypes):
@@ -518,7 +526,7 @@
     lastDir = os.path.dirname(fname)
     file_chooser.directory(lastDir)
     format = sorted_filetypes[file_chooser.filter_value()][0]
-    
+
     try:
         base.canvas.print_figure(fname, format=format)
     except IOError, msg:

Modified: trunk/matplotlib/lib/matplotlib/backends/backend_gtk.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backends/backend_gtk.py     2008-07-24 
08:50:43 UTC (rev 5830)
+++ trunk/matplotlib/lib/matplotlib/backends/backend_gtk.py     2008-07-24 
10:02:13 UTC (rev 5831)
@@ -396,7 +396,14 @@
         gtk.gdk.flush()
         gtk.gdk.threads_leave()
 
+    def start_event_loop(self,*args,**kwargs):
+        FigureCanvasBase.start_event_loop_default(self,*args,**kwargs)
+    start_event_loop.__doc__=FigureCanvasBase.start_event_loop_default.__doc__
 
+    def stop_event_loop(self,*args,**kwargs):
+        FigureCanvasBase.stop_event_loop_default(self,*args,**kwargs)
+    stop_event_loop.__doc__=FigureCanvasBase.stop_event_loop_default.__doc__
+
 class FigureManagerGTK(FigureManagerBase):
     """
     Public attributes

Modified: trunk/matplotlib/lib/matplotlib/backends/backend_qt.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backends/backend_qt.py      2008-07-24 
08:50:43 UTC (rev 5830)
+++ trunk/matplotlib/lib/matplotlib/backends/backend_qt.py      2008-07-24 
10:02:13 UTC (rev 5831)
@@ -177,6 +177,14 @@
     def flush_events(self):
         qt.qApp.processEvents()
 
+    def start_event_loop(self,*args,**kwargs):
+        FigureCanvasBase.start_event_loop_default(self,*args,**kwargs)
+    start_event_loop.__doc__=FigureCanvasBase.start_event_loop_default.__doc__
+
+    def stop_event_loop(self,*args,**kwargs):
+        FigureCanvasBase.stop_event_loop_default(self,*args,**kwargs)
+    stop_event_loop.__doc__=FigureCanvasBase.stop_event_loop_default.__doc__
+
 class FigureManagerQT( FigureManagerBase ):
     """
     Public attributes

Modified: trunk/matplotlib/lib/matplotlib/backends/backend_qt4.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backends/backend_qt4.py     2008-07-24 
08:50:43 UTC (rev 5830)
+++ trunk/matplotlib/lib/matplotlib/backends/backend_qt4.py     2008-07-24 
10:02:13 UTC (rev 5831)
@@ -181,6 +181,14 @@
     def flush_events(self):
         Qt.qApp.processEvents()
 
+    def start_event_loop(self,*args,**kwargs):
+        FigureCanvasBase.start_event_loop_default(self,*args,**kwargs)
+    start_event_loop.__doc__=FigureCanvasBase.start_event_loop_default.__doc__
+
+    def stop_event_loop(self,*args,**kwargs):
+        FigureCanvasBase.stop_event_loop_default(self,*args,**kwargs)
+    stop_event_loop.__doc__=FigureCanvasBase.stop_event_loop_default.__doc__
+
 class FigureManagerQT( FigureManagerBase ):
     """
     Public attributes

Modified: trunk/matplotlib/lib/matplotlib/backends/backend_tkagg.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backends/backend_tkagg.py   2008-07-24 
08:50:43 UTC (rev 5830)
+++ trunk/matplotlib/lib/matplotlib/backends/backend_tkagg.py   2008-07-24 
10:02:13 UTC (rev 5831)
@@ -287,6 +287,14 @@
     def flush_events(self):
         self._master.update()
 
+    def start_event_loop(self,*args,**kwargs):
+        FigureCanvasBase.start_event_loop_default(self,*args,**kwargs)
+    start_event_loop.__doc__=FigureCanvasBase.start_event_loop_default.__doc__
+
+    def stop_event_loop(self,*args,**kwargs):
+        FigureCanvasBase.stop_event_loop_default(self,*args,**kwargs)
+    stop_event_loop.__doc__=FigureCanvasBase.stop_event_loop_default.__doc__
+
 class FigureManagerTkAgg(FigureManagerBase):
     """
     Public attributes

Modified: trunk/matplotlib/lib/matplotlib/backends/backend_wx.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backends/backend_wx.py      2008-07-24 
08:50:43 UTC (rev 5830)
+++ trunk/matplotlib/lib/matplotlib/backends/backend_wx.py      2008-07-24 
10:02:13 UTC (rev 5831)
@@ -1185,7 +1185,57 @@
         if figManager is not None:
             figManager.canvas.draw()
 
+    def start_event_loop(self, timeout=0):
+        """
+        Start an event loop.  This is used to start a blocking event
+        loop so that interactive functions, such as ginput and
+        waitforbuttonpress, can wait for events.  This should not be
+        confused with the main GUI event loop, which is always running
+        and has nothing to do with this.
 
+        Call signature::
+
+        start_event_loop(self,timeout=0)
+
+        This call blocks until a callback function triggers
+        stop_event_loop() or *timeout* is reached.  If *timeout* is
+        <=0, never timeout.
+        """
+        root = self.GetTopLevelParent()
+        bind(root, wx.EVT_CLOSE, self.stop_event_loop)
+
+        id = wx.NewId()
+        timer = wx.Timer(self, id=id)
+        if timeout > 0:
+            timer.Start(timeout*1000, oneShot=True)
+            bind(self, wx.EVT_TIMER, self.stop_event_loop, id=id)
+        self._event_loop.Run()
+        timer.Stop()
+
+    def stop_event_loop(self, event=None):
+        """
+        Stop an event loop.  This is used to stop a blocking event
+        loop so that interactive functions, such as ginput and
+        waitforbuttonpress, can wait for events.
+
+        Call signature::
+
+        stop_event_loop_default(self)
+        """
+        if self._event_loop.IsRunning():
+            self._event_loop.Exit()
+
+# Event binding code changed after version 2.5
+if wx.VERSION_STRING >= '2.5':
+    def bind(actor,event,action,**kw):
+        actor.Bind(event,action,**kw)
+else:
+    def bind(actor,event,action,id=None):
+        if id is not None:
+            event(actor, id, action)
+        else:
+            event(actor,action)
+
 def show():
     """
     Current implementation assumes that matplotlib is executed in a PyCrust

Modified: trunk/matplotlib/lib/matplotlib/blocking_input.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/blocking_input.py   2008-07-24 08:50:43 UTC 
(rev 5830)
+++ trunk/matplotlib/lib/matplotlib/blocking_input.py   2008-07-24 10:02:13 UTC 
(rev 5831)
@@ -50,7 +50,7 @@
 
         # Check if we have enough events already
         if len(self.events) >= self.n and self.n > 0:
-            self.done = True
+            self.fig.canvas.stop_event_loop()
 
     def post_event(self):
         """For baseclass, do nothing but collect events"""
@@ -90,7 +90,6 @@
         self.n = n
 
         self.events = []
-        self.done = False
         self.callbacks = []
 
         # Ensure that the figure is shown
@@ -101,17 +100,8 @@
             self.callbacks.append( self.fig.canvas.mpl_connect(n, 
self.on_event) )
 
         try:
-            # wait for n clicks
-            counter = 0
-            while not self.done:
-                self.fig.canvas.flush_events()
-                time.sleep(0.01)
-
-                # check for a timeout
-                counter += 1
-                if timeout > 0 and counter > timeout/0.01:
-                    print "Timeout reached";
-                    break;
+            # Start event loop
+            self.fig.canvas.start_event_loop(timeout=timeout)
         finally: # Run even on exception like ctrl-c
             # Disconnect the callbacks
             self.cleanup()
@@ -175,7 +165,7 @@
         # consistent with matlab and sometimes quite useful, but will
         # require the user to test how many points were actually
         # returned before using data.
-        self.done = True
+        self.fig.canvas.stop_event_loop()
 
     def button3( self, event ):
         """


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Matplotlib-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins

Reply via email to