wxPython和matplotlib.widgets

时间:2012-12-25 04:07:49

标签: python matplotlib wxpython

我正在开发一个Python应用程序,该应用程序使用wxPython作为带有嵌入式matplotlib图形的GUI。在我尝试使用名为SpanSelector的matplotlib GUI-neutral widget之前,它确实很顺利。之前,我试图自己编写这种行为,这种行为并不顺利,所以我很高兴有一个内置的小部件可以为我处理它。这些小部件应该适用于任何GUI后端,而wxPython绝对是受支持的后端。

我的代码目前非常简单;我有一个定义的应用程序类与这些(相关)函数:

def init_gui(self):
    ...
    self.button5 = wx.Button(tab, label="Manual select", size=(120, 30))
    self.button5.Bind(wx.EVT_BUTTON, self.get_selection_manual)
    ...

def get_selection_manual(self, event):
    span = matplotlib.widgets.SpanSelector(self.ax, \
        self.process_selection_manual, "horizontal", useblit=True, \
        rectprops=dict(alpha=0.5, facecolor="red"))

def process_selection_manual(self, vmin, vmax):
    print vmin, vmax

如果它正常工作,它所要做的就是打印出用户点击按钮后所做的选择。我知道调用了get_selection_manual,但是单击并拖动绘图永远不会创建选择,并且永远不会调用回调process_selection_manual

我尝试输入sleep(),然后更新显示。有趣的是,当我的应用程序在sleep(5)而不是time.sleep(5)上崩溃时,我得到了(有点)工作。所以Python已经停滞不前了,但它的选择就像它应该的那样。我以前从未见过这种情况,而且我不确定这意味着什么。我还没有找到任何使用wxPython和matplotlib小部件的例子,所以非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

原来这是一个非常简单的解决方案:span必须声明为self.span ...也许在它可以做任何事之前进行垃圾收集?无论如何,如果我替换

,它现在有效
def get_selection_manual(self, event):
    span = matplotlib.widgets.SpanSelector(self.ax, \
        self.process_selection_manual, "horizontal", useblit=True, \
        rectprops=dict(alpha=0.5, facecolor="red"))

def get_selection_manual(self, event):
    self.span = matplotlib.widgets.SpanSelector(self.ax, \
        self.process_selection_manual, "horizontal", \
        rectprops=dict(alpha=0.5, facecolor="red"))

我还删除了useblit标志,因为它弄乱了颜色;我不认为这与此修复有关,但仍然有用。