在wxPython中嵌入Matplotlib时如何选择数据点

3
我正在尝试选择并显示在wxPython中嵌入的matplotlib中某一点的数据。我编写了一个最小示例来绘制随机数据,代码如下。
import numpy as np
import wx


from matplotlib.figure import Figure
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas

class PlotGUI(wx.Frame):
    """Class to display basic GUI elements."""
    def __init__(self, parent):
        wx.Frame.__init__(self, parent)

        panel = wx.Panel(self)
        self.panel = panel

        vert_sizer = wx.BoxSizer(wx.VERTICAL)
        self.vert_sizer = vert_sizer

        panel.figure = Figure()
        panel.canvas = FigureCanvas(panel, -1, panel.figure)
        self.panel.canvas = panel.canvas

        panel.axes = panel.figure.add_subplot(111)
        self.panel.axes = panel.axes

        vert_sizer.Add(panel.canvas, 1, wx.LEFT | wx.TOP | wx.EXPAND)
        panel.SetSizer(vert_sizer)
        panel.Fit()

        self.plot_data()

        self.panel.canvas.mpl_connect('pick_event', self.display_data)

    def display_data(self, event):
        wx.MessageBox('x :'+str(event.mouseevent.xdata) + 'y: ' + str(event.mouseevent.ydata), 'Info',wx.OK | wx.ICON_INFORMATION)

    def plot_data(self):
        x = np.arange(10)
        y = np.random.randn(10)
        self.panel.axes.plot(x,y, 'o', picker = 5)

def main():
    app = wx.App()
    GUI = PlotGUI(None)
    GUI.Show()
    app.MainLoop()

if __name__ == '__main__':
    main()

当我第一次点击一个点时,数据正确显示。但是,下一次我点击一个点时,出现了错误。我尝试搜索此错误,但没有找到任何相关的主题。感谢您的帮助。

Traceback (most recent call last):
  File "/home/pythontology/anaconda/lib/python2.7/site-packages/matplotlib/backends/backend_wx.py", line 1137, in _onLeftButtonDown
    self.CaptureMouse()
  File "/home/pythontology/anaconda/lib/python2.7/site-packages/wx-3.0-gtk2/wx/_core.py", line 10641, in CaptureMouse
    return _core_.Window_CaptureMouse(*args, **kwargs)
wx._core.PyAssertionError: C++ assertion "!wxMouseCapture::IsInCaptureStack(this)" failed at ./src/common/wincmn.cpp(3271) in CaptureMouse(): Recapturing the mouse in the same window?

1
你能用1.4.0rc2版本测试一下吗?我记得之前有类似的问题,不过已经被修复了。 - tacaswell
但是不能快速找到问题所在... - tacaswell
我也在这里看过:http://wheels.scikit-image.org/ 似乎只有Mac的wheel文件。 - Pythontology
https://launchpad.net/~takluyver/+archive/ubuntu/matplotlib-daily - tacaswell
我刚刚在虚拟环境中从Github安装了1.4.0rc2版本,但是当我测试这段代码时仍然收到相同的错误。有什么想法吗? - Pythontology
显示剩余2条评论
1个回答

3

经过大量搜索,tcaswell推荐了这篇帖子。看完后,我发现在wx.MessageBox之前添加一行代码 if self.panel.canvas.HasCapture(): self.panel.canvas.ReleaseMouse() 可以解决该问题。


如果您能够将此作为示例放入mpl文档中的UI嵌入示例文件夹中,那就太好了。 - tacaswell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接