Howdy,

I spent a while chasing my tail today with some event handling code
until I tried backtracking from SVN matplotlib back to 0.99.1 (the one
in ubuntu 10.04) and the problem went away.

I'm attaching a script that reproduces the problem with a full
description in the docstring, reproduced here for completeness:

This example wires two event handlers that both respond to clicks by printing
event info identically.  One is written as a standalone function, the other as
a method of an object.

- when run with MPL 0.99.1.1 (stock in ubuntu 10.04), both fire fine:

amirbar[mplbrush]> python mpleventbug.py
MPL version: 0.99.1.1
MPL: /usr/lib/pymodules/python2.6/matplotlib/__init__.py
/usr/lib/pymodules/python2.6/matplotlib/backends/backend_gtk.py:621:
DeprecationWarning: Use the new widget gtk.Tooltip
  self.tooltips = gtk.Tooltips()
C1 - button=1, x=146, y=229, xdata=23.783488, ydata=0.846491
C2 - button=1, x=146, y=229, xdata=23.783488, ydata=0.846491
C1 - button=1, x=216, y=189, xdata=42.919628, ydata=0.671053
C2 - button=1, x=216, y=189, xdata=42.919628, ydata=0.671053
C1 - button=1, x=288, y=117, xdata=62.602515, ydata=0.355263
C2 - button=1, x=288, y=117, xdata=62.602515, ydata=0.355263
etc...

- when run with matplotlib r8721, the one that is a method does not fire:

amirbar[mplbrush]> python mpleventbug.py
MPL version: 1.0.0
MPL: /home/fperez/usr/opt/lib/python2.6/site-packages/matplotlib/__init__.pyc
C1 - button=1, x=150, y=170, xdata=24.876982, ydata=0.587719
C1 - button=1, x=169, y=160, xdata=30.071077, ydata=0.543860
C1 - button=1, x=187, y=135, xdata=34.991799, ydata=0.434211
C1 - button=1, x=210, y=120, xdata=41.279388, ydata=0.368421


###

This manifested itself in some more complex MPL code that had multiple
events not working when run inside ipython, but working OK outside of
ipython.  Fortunately, the small self-contained example demonstrates
the problem even with ipython not being in the picture at all (the
runs above were from the command line), so I think there is an issue
in MPL proper.

Sorry that I can't dig deeper into the code right now to look for a fix...

Timing note: EPD is planning a release in a few weeks, I don't know
how close MPL is to a bugfix release in the 1.0.x series.  I don't
know what version of mpl EPD plans to use, but if event handling is
really broken and a fix is feasible in the time available, it might be
worth pushing it through.

Cheers,

f
"""Event handling bug in matplotlib 1.0.x from svn.

This example wires two event handlers that both respond to clicks by printing
event info identically.  One is written as a standalone function, the other as
a method of an object.

- when run with MPL 0.99.1.1 (stock in ubuntu 10.04), both fire fine:

amirbar[mplbrush]> python mpleventbug.py 
MPL version: 0.99.1.1
MPL: /usr/lib/pymodules/python2.6/matplotlib/__init__.py
/usr/lib/pymodules/python2.6/matplotlib/backends/backend_gtk.py:621: DeprecationWarning: Use the new widget gtk.Tooltip
  self.tooltips = gtk.Tooltips()
C1 - button=1, x=146, y=229, xdata=23.783488, ydata=0.846491
C2 - button=1, x=146, y=229, xdata=23.783488, ydata=0.846491
C1 - button=1, x=216, y=189, xdata=42.919628, ydata=0.671053
C2 - button=1, x=216, y=189, xdata=42.919628, ydata=0.671053
C1 - button=1, x=288, y=117, xdata=62.602515, ydata=0.355263
C2 - button=1, x=288, y=117, xdata=62.602515, ydata=0.355263
etc...

- when run with matplotlib r8721, the one that is a method does not fire:

amirbar[mplbrush]> python mpleventbug.py 
MPL version: 1.0.0
MPL: /home/fperez/usr/opt/lib/python2.6/site-packages/matplotlib/__init__.pyc
C1 - button=1, x=150, y=170, xdata=24.876982, ydata=0.587719
C1 - button=1, x=169, y=160, xdata=30.071077, ydata=0.543860
C1 - button=1, x=187, y=135, xdata=34.991799, ydata=0.434211
C1 - button=1, x=210, y=120, xdata=41.279388, ydata=0.368421

"""
import sys

import matplotlib
import matplotlib.pylab as plt
import numpy as np

def onclick1(event):
    print 'C1 - button=%d, x=%d, y=%d, xdata=%f, ydata=%f'%(
        event.button, event.x, event.y, event.xdata, event.ydata)
    sys.stdout.flush()

class Handler:
    def __init__(self, figure):
        cid1 = figure.canvas.mpl_connect('button_press_event', onclick1)
        cid2 = figure.canvas.mpl_connect('button_press_event', self.onclick2)

    def onclick2(self, event):
        print 'C2 - button=%d, x=%d, y=%d, xdata=%f, ydata=%f'%(
            event.button, event.x, event.y, event.xdata, event.ydata)
        sys.stdout.flush()
        

if __name__ == "__main__":

    print "MPL version:", matplotlib.__version__
    print "MPL:", matplotlib.__file__
    
    f = plt.figure()
    ax = f.add_subplot(111)
    ax.plot(np.random.rand(100))
    Handler(f)

    plt.show()
------------------------------------------------------------------------------
Start uncovering the many advantages of virtual appliances
and start using them to simplify application deployment and
accelerate your shift to cloud computing.
http://p.sf.net/sfu/novell-sfdev2dev
_______________________________________________
Matplotlib-devel mailing list
Matplotlib-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-devel

Reply via email to