Hi Soren,

2010/5/6 Søren Nielsen <soren.skou.niel...@gmail.com>:
> Thanks Matt,
>
> The wx.ReleaseMouse() event when called before the wx.MessageBox also works
> great.
>
> I have a similar problem when I want to make a popup menu after the user has
> clicked on a patch (through the pick event) .. it works on Windows but the
> popup menu doesn't show on Linux (or only shows in rare occasions) . A
> wx.ReleaseMouse() doesn't seem to work here.. I've made a sample script that
> shows the problem. It doesn't use the pick event, but the same problem
> applies when using the button_press_event. If I want to go through the pick
> event then of course the button_release_event workaround doesn't work
> either.
>
> Also, clicking the right and left button like crazy to make the popup menu
> show on linux can result in the error:
>
> Traceback (most recent call last):
>   File
> "/usr/lib64/python2.6/site-packages/matplotlib/backends/backend_wx.py", line
> 1218, in _onKeyDown
>     FigureCanvasBase.key_press_event(self, key, guiEvent=evt)
>   File "/usr/lib64/python2.6/site-packages/matplotlib/backend_bases.py",
> line 1142, in key_press_event
>     event = KeyEvent(s, self, key, self._lastx, self._lasty,
> guiEvent=guiEvent)
>   File "/usr/lib64/python2.6/site-packages/matplotlib/backend_bases.py",
> line 970, in __init__
>     LocationEvent.__init__(self, name, canvas, x, y, guiEvent=guiEvent)
>   File "/usr/lib64/python2.6/site-packages/matplotlib/backend_bases.py",
> line 813, in __init__
>     axes_list = [a for a in self.canvas.figure.get_axes() if
> a.in_axes(self)]
>   File "/usr/lib64/python2.6/site-packages/matplotlib/axes.py", line 1538,
> in in_axes
>     return self.patch.contains(mouseevent)[0]
>   File "/usr/lib64/python2.6/site-packages/matplotlib/patches.py", line 501,
> in contains
>     x, y = self.get_transform().inverted().transform_point(
>   File "/usr/lib64/python2.6/site-packages/matplotlib/patches.py", line 119,
> in get_transform
>     return self.get_patch_transform() + artist.Artist.get_transform(self)
>   File "/usr/lib64/python2.6/site-packages/matplotlib/transforms.py", line
> 1033, in __add__
>     return composite_transform_factory(self, other)
>   File "/usr/lib64/python2.6/site-packages/matplotlib/transforms.py", line
> 2004, in composite_transform_factory
>     return CompositeAffine2D(a, b)
>   File "/usr/lib64/python2.6/site-packages/matplotlib/transforms.py", line
> 1964, in __init__
>     Affine2DBase.__init__(self)
>   File "/usr/lib64/python2.6/site-packages/matplotlib/transforms.py", line
> 1304, in __init__
>     Transform.__init__(self)
>   File "/usr/lib64/python2.6/site-packages/matplotlib/transforms.py", line
> 87, in __init__
>     self._parents = WeakKeyDictionary()
>   File "/usr/lib64/python2.6/weakref.py", line 232, in __init__
>     def remove(k, selfref=ref(self)):
> RuntimeError: maximum recursion depth exceeded while calling a Python object

I don't see that error, but perhaps I didn't emulate "click like
crazy" well enough.

I also see that trying to get a Popup Menu on Linux from events
generated by mpl does not reliably display a menu.  In my experience,
a work-around is to replace a direct call to
    wx.Popup(menu)
with
    wx.CallAfter(wx.Popup, menu)

I don't know if this is related to the problem described earlier, in
which the wx object containing the FigureCanvasWxAgg needs to call
ReleaseMouse() on Linux but not Windows.  As I said earlier, I have
not investigated very thoroughly so am reluctant to jump to any
conclusions about where the problem really lies and what the best
solution is.

An example with a Popup Menu that displays on right- or left-click of
a FigureCanvasWxAgg is below.
Cheers,

--Matt Newville

#!/usr/bin/python
import wx
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg
from matplotlib.figure import Figure

class PlotFrame(wx.Frame):
    def __init__(self, title='Plot Frame', **kwds):
        wx.Frame.__init__(self, None, -1, title=title, **kwds)
        self.panel = wx.Panel(self, -1,size=(600,500))
        self.fig = Figure()
        self.canvas = FigureCanvasWxAgg(self.panel, -1, self.fig)
        self.fig.add_subplot(111)

        self.canvas.mpl_connect('button_press_event',
                                self.onMouseButtonClick)
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.canvas, 1, wx.LEFT |wx.TOP | wx.GROW)
        self.panel.SetSizer(sizer)

        self.SetAutoLayout(True)
        self.Fit()

    def onMouseButtonClick(self, event=None):
        if event is None:
            return
        if event.inaxes:
            menu = wx.Menu()
            if event.button == 1:
                menu.Append(1, 'Left Click: Set as Background file')
                self.Bind(wx.EVT_MENU, self.onSelect1)
            elif event.button == 3:
                menu.Append(1, 'RightClick: Do something else')
                self.Bind(wx.EVT_MENU, self.onSelect2)

            wx.CallAfter(self.PopupMenu, menu)

    def onSelect1(self, event=None):
        print 'select 1'

    def onSelect2(self, event=None):
        print 'select 2'

if __name__ == '__main__':
    app = wx.PySimpleApp()
    frame = PlotFrame(title='Test')
    frame.Show()
    frame.Raise()
    app.MainLoop()

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

_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Reply via email to