mouse events, get data and disconnect

Hello darkside,

the below example seems to do the job.
The problem with x, y = event.xdata, event.ydata could be due to a
local-global-variable issue (solution: define x, y with keyword global,
i.e. "global x, y" in your function 'click' [ -> they become global
variables] to change their values in this function and use them in the main
program, too).

best regards,
Matthias

----------------------------------------------------------------------------------------------------------

import pylab
from matplotlib.widgets import Cursor

datax=[]
datay =[]

def click(event):
    if event.button == 1:
        if event.inaxes:
            print 'data coords: ', event.xdata, event.ydata
            datax.append(event.xdata)
            datay.append(event.ydata)
            # disconnect the connection with id 'cid' after the first run of
            # this part
            pylab.disconnect(cid)

    if event.button == 3:
        # only possible before the first run of the upper
        # part ' if event.button == 1'
        pylab.close()

    return datax,datay

fig = pylab.figure(figsize=(8,6))
ax = fig.add_subplot(111)
ax.plot(pylab.arange(10))
cursor = Cursor(ax, useblit=False, color='red', linewidth=2)
cursor.horizOn = False

# connection with id 'cid'
cid = pylab.connect('button_press_event', click)

pylab.show()
print 'los arrays de data son: ', datax,datay

···

-----------------------------------------------------------------------------------------------------

On Sunday 10 June 2007 04:54, darkside wrote:

Hello,
I've tried your idea, but it doesn't work.
If I put:
----------------------
datax=[]
datay =[]

def click(event):

    if event.button == 1:
        if event.inaxes:
            print 'data coords: ', event.xdata, event.ydata
            datax.append(event.xdata)
            datay.append(event.ydata)
            pylab.disconnect(click)

    if event.button == 3:
        pylab.close()

    return datax,datay

fig = pylab.figure(figsize=(8,6))
ax = fig.add_subplot(111)
ax.plot(pylab.arange(10))
cursor = Cursor(ax, useblit=False, color='red', linewidth=2)
cursor.horizOn = False

pylab.connect('button_press_event', click)

pylab.show()
print 'los arrays de data son: ', datax,datay
------------------------
It returns the arrays, but it doesn't stop after one click, I have to press
number 3 to exit.

I tried to change to x, y instead of datax, datay in the following way:

------------------------
x, y = 0,0

x, y = event.x, event.y
-----------------------------

But in this case I get an error: "name 'x' is not defined"
And I don't know why, because I only change the lines refering to datax,
datay. It seems that only works with lists, but I don't know if this is the
problem exactly.

With the command close, I can close the figure window pressing right mouse
button. It works (at least something works).

Thank you for your help.

2007/6/4, Matthias Michler <MatthiasMichler@...361...>:
> Hello darkside,
>
> maybe the following little examples helps you with disconnecting:
> >------------------------------------------------------------------------
> >--------
>
> from pylab import *
>
> def event_response(event):
> print event.name
> disconnect(cid)
>
> subplot(111)
> cid = connect('button_press_event', event_response)
>
> show()
>
> >------------------------------------------------------------------------
> >-----
>
> concerning opening of figures:
> I think it is not possible to open a figure after the show()
> ( I asked some time ago with subject "open / close or set active figures
> during mainloop", but unfortunately without response).
>
> Maybe it would be sufficient for you to clean the figure or the axes
> (pylab.clf/cla), resetting labels and use the same connected event
> several times.
>
> best regards,
> Matthias
>
> On Monday 04 June 2007 04:28, darkside wrote:
> > I'm trying to use matplotlib to get an x point on some figures by
>
> mouse
>
> > clicking.
> > To do this I try the next example:
> > -------------------------
> > datax=[]
> > datay =[]
> > def click(event):
> > x, y = event.x, event.y
> > if event.button == 1:
> > if event.inaxes:
> > print 'data coords: ', event.xdata, event.ydata
> > datax.append(event.xdata)
> > datay.append(event.ydata)
> > if event.button == 3:
> > pylab.close()
> > return datax,datay
> > fig = pylab.figure(figsize=(8,6))
> > ax = fig.add_subplot(111)
> >
> > - Ignored:
> > ax.plot(pylab.arange(10))
> > cursor = Cursor(ax, useblit=False, color='red', linewidth=2)
> > cursor.horizOn = False
> >
> > pylab.connect('button_press_event', click)
> >
> > pylab.show()
> > pylab.disconnect(click)
> > print 'los arrays de data son: ', datax,datay
> > ------------------------------------------------------
> >
> > My problem is tha I want to only be able to click each figure once,
>
> then
>
> > lock the
> > figure (making it unclickable), close it and open another one. But
>
> I'm
>
> > not
> > able to
> > implement this.
> > Anyone have any suggestions?.
>
> -------------------------------------------------------------------------
> This SF.net email is sponsored by DB2 Express
> Download DB2 Express C - the FREE version of DB2 express and take
> control of your XML. No limits. Just data. Click to get it now.
> http://sourceforge.net/powerbar/db2/
> _______________________________________________
> Matplotlib-users mailing list
> Matplotlib-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/matplotlib-users