I'm not at all attached to any particular functionality. Feel free to mangle it as you see fit!
On Feb 5, 2008 5:11 PM, John Hunter <[EMAIL PROTECTED]> wrote: > On Feb 5, 2008 3:58 PM, John Hunter <[EMAIL PROTECTED]> wrote: > > On Feb 2, 2008 8:48 AM, Gael Varoquaux <[EMAIL PROTECTED]> wrote: > > > > > Here is the new patch. I added visual feedback when accumulating points. > > > I hope the docstrings are clear. > > > > Great -- thanks again. I applied this patch and created a new example > > ginput_demo.py > > Jack replied to me offlist so I am going to paste in his post below. > Perhaps you and Gael can consult on the ideal functionality of ginput > vis-a-vis optional line segment drawing, etc... > > > > From Jack Sankey <[EMAIL PROTECTED]> > to John Hunter <[EMAIL PROTECTED]>, > date Feb 5, 2008 4:02 PM > subject Re: [matplotlib-devel] ginput: blocking call for mouse input > mailed-by gmail.com > > > > > Woa, it's working on GTKAgg using wx.Yield()? You must have added some voodoo > :) > > Also, my version of GaelInput has seemed to stop evolving. This > version has the option to draw lines between clicks, which I use a > lot. Also, the default timeout is 0 now, since you can always > right-click to abort. > > -Jack > > > > class GaelInput(object): > """ > Class that create a callable object to retrieve mouse click in a > blocking way, a la MatLab. Based on Gael Varoquaux's almost-working > object. Thanks Gael! I've wanted to get this working for years! > > -Jack > """ > > debug = False > cid = None # event connection object > clicks = [] # list of click coordinates > n = 1 # number of clicks we're waiting for > lines = False # if we should draw the lines > > def on_click(self, event): > """ > Event handler that will be passed to the current figure to > retrieve clicks. > """ > > # write the debug information if we're supposed to > if self.debug: print "button "+str(event.button)+": > "+str(event.xdata)+", "+str(event.ydata) > > # if this event's a right click we're done > if event.button == 3: > self.done = True > return > > # if it's a valid click (and this isn't an extra event > # in the queue), append the coordinates to the list > if event.inaxes and not self.done: > self.clicks.append([event.xdata, event.ydata]) > > # now if we're supposed to draw lines, do so > if self.lines and len(self.clicks) > 1: > event.inaxes.plot([self.clicks[-1][0], self.clicks[-2][0]], > [self.clicks[-1][1], self.clicks[-2][1]], > color='w', linewidth=2.0, > scalex=False, scaley=False) > event.inaxes.plot([self.clicks[-1][0], self.clicks[-2][0]], > [self.clicks[-1][1], self.clicks[-2][1]], > color='k', linewidth=1.0, > scalex=False, scaley=False) > _pylab.draw() > > # if we have n data points, we're done > if len(self.clicks) >= self.n and self.n is not 0: > self.done = True > return > > > def __call__(self, n=1, timeout=0, debug=False, lines=False): > """ > Blocking call to retrieve n coordinate pairs through mouse clicks. > > n=1 number of clicks to collect. Set n=0 to keep collecting > points until you click with the right mouse button. > > timeout=30 maximum number of seconds to wait for clicks > before giving up. > timeout=0 to disable > > debug=False show each click event coordinates > > lines=False draw lines between clicks > """ > > # just for printing the coordinates > self.debug = debug > > # for drawing lines > self.lines = lines > > # connect the click events to the on_click function call > self.cid = _pylab.connect('button_press_event', self.on_click) > > # initialize the list of click coordinates > self.clicks = [] > > # wait for n clicks > self.n = n > self.done = False > t = 0.0 > while not self.done: > # key step: yield the processor to other threads > _wx.Yield(); > _time.sleep(0.1) > > # check for a timeout > t += 0.1 > if timeout and t > timeout: print "ginput timeout"; break; > > # All done! Disconnect the event and return what we have > _pylab.disconnect(self.cid) > self.cid = None > return _numpy.array(self.clicks) > > > > def ginput(n=1, timeout=0, show=True, lines=False): > """ > Simple functional call for physicists. This will wait for n clicks > from the user and > return a list of the coordinates of each click. > > n=1 number of clicks to collect > timeout=30 maximum number of seconds to wait for clicks > before giving up. > timeout=0 to disable > show=True print the clicks as they are received > lines=False draw lines between clicks > """ > > x = GaelInput() > return x(n, timeout, show, lines) > ------------------------------------------------------------------------- This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2008. http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ _______________________________________________ Matplotlib-devel mailing list Matplotlib-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-devel