On 10/07/2010 07:11 PM, Åke Kullenberg wrote:
> I am using Python 2.7 and Matplotlib 1.0.0 and I am having problems
> getting events triggering in this example below. I have taken the
> draggable rectangle example (with blit) code from the event handling
> documentation
> (http://matplotlib.sourceforge.net/users/event_handling.html) and tried
> to put it in a wxPython frame. The problem I have is that I can't get
> any events to register. When I click in the figure nothing happens, the
> on_press section in the code is never reached.
>
> Any suggestions how I can make this work?

Keep references to your DraggableRectangle objects.  As it is you are 
putting them in a list, but the list and its contents are being 
garbage-collected as soon as TestFrame.__init__() finishes.

This was discussed recently on the list; I think you are the third 
person in the last week or two who has run into this consequence of a 
change that was made (for good reasons) in mpl 1.0.

Eric

>
> I have a vague recollection of this working in matplotlib < 1.0.0 and
> python < 2.7, but I am not 100% sure as it was a long time ago I last
> worked with matplotlib.
>
> The code:
>
> import numpy as np
> import wx
> from matplotlib.figure import Figure
> from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as
> FigureCanvas
>
> class DraggableRectangle:
> lock = None  # only one can be animated at a time
> def __init__(self, rect):
> self.rect = rect
> self.press = None
> self.background = None
>
> def connect(self):
> 'connect to all the events we need'
> self.cidpress =
> self.rect.figure.canvas.mpl_connect('button_press_event', self.on_press)
> self.cidrelease =
> self.rect.figure.canvas.mpl_connect('button_release_event', self.on_release)
> self.cidmotion =
> self.rect.figure.canvas.mpl_connect('motion_notify_event', self.on_motion)
>
> def on_press(self, event):
> 'on button press we will see if the mouse is over us and store some data'
> if event.inaxes != self.rect.axes: return
> if DraggableRectangle.lock is not None: return
> contains, attrd = self.rect.contains(event)
> if not contains: return
> print 'event contains', self.rect.xy
> x0, y0 = self.rect.xy
> self.press = x0, y0, event.xdata, event.ydata
> DraggableRectangle.lock = self
>
> # draw everything but the selected rectangle and store the pixel buffer
> canvas = self.rect.figure.canvas
> axes = self.rect.axes
> self.rect.set_animated(True)
> canvas.draw()
> self.background = canvas.copy_from_bbox(self.rect.axes.bbox)
>
> # now redraw just the rectangle
> axes.draw_artist(self.rect)
>
> # and blit just the redrawn area
> canvas.blit(axes.bbox)
>
> def on_motion(self, event):
> 'on motion we will move the rect if the mouse is over us'
> if DraggableRectangle.lock is not self:
> return
> if event.inaxes != self.rect.axes: return
> x0, y0, xpress, ypress = self.press
> dx = event.xdata - xpress
> dy = event.ydata - ypress
> self.rect.set_x(x0+dx)
> self.rect.set_y(y0+dy)
>
> canvas = self.rect.figure.canvas
> axes = self.rect.axes
> # restore the background region
> canvas.restore_region(self.background)
>
> # redraw just the current rectangle
> axes.draw_artist(self.rect)
>
> # blit just the redrawn area
> canvas.blit(axes.bbox)
>
> def on_release(self, event):
> 'on release we reset the press data'
> if DraggableRectangle.lock is not self:
> return
>
> self.press = None
> DraggableRectangle.lock = None
>
> # turn off the rect animation property and reset the background
> self.rect.set_animated(False)
> self.background = None
>
> # redraw the full figure
> self.rect.figure.canvas.draw()
>
> def disconnect(self):
> 'disconnect all the stored connection ids'
> self.rect.figure.canvas.mpl_disconnect(self.cidpress)
> self.rect.figure.canvas.mpl_disconnect(self.cidrelease)
> self.rect.figure.canvas.mpl_disconnect(self.cidmotion)
>
> class TestFrame(wx.Frame):
> def __init__(self):
> wx.Frame.__init__(self, None, title="Event Test", size=(640,480))
> panel = wx.Panel(self,-1)
> fig = Figure()
> canvas = FigureCanvas(panel, -1, fig)
> ax = fig.add_subplot(111)
> rects = ax.bar(range(10), 20*np.random.rand(10))
> drs = []
> for rect in rects:
> dr = DraggableRectangle(rect)
> dr.connect()
> drs.append(dr)
> fig.canvas.draw()
>
> if __name__ == "__main__":
> app = wx.App()
> theFrame = TestFrame()
> theFrame.Show()
> app.MainLoop()
>
>
>
> ------------------------------------------------------------------------------
> Beautiful is writing same markup. Internet Explorer 9 supports
> standards for HTML5, CSS3, SVG 1.1,  ECMAScript5, and DOM L2&  L3.
> Spend less time writing and  rewriting code and more time creating great
> experiences on the web. Be a part of the beta today.
> http://p.sf.net/sfu/beautyoftheweb
>
>
>
> _______________________________________________
> Matplotlib-users mailing list
> Matplotlib-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/matplotlib-users



------------------------------------------------------------------------------
Beautiful is writing same markup. Internet Explorer 9 supports
standards for HTML5, CSS3, SVG 1.1,  ECMAScript5, and DOM L2 & L3.
Spend less time writing and  rewriting code and more time creating great
experiences on the web. Be a part of the beta today.
http://p.sf.net/sfu/beautyoftheweb
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Reply via email to