1

我正在开发一个 Python 应用程序,该应用程序将 wxPython 用于带有嵌入式 matplotlib 图的 GUI。在我尝试使用 matplotlib GUI 中性小部件(称为SpanSelector. 以前,我试图自己编写这种行为,但进展并不顺利,所以我很高兴有一个内置的小部件可以为我处理它。这些小部件应该适用于任何 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()然后更新显示。有趣的是,当我的应用程序在 asleep(5)而不是time.sleep(5). 因此 Python 停滞不前,但它按照当时的预期绘制了选择。我以前从未见过这种情况,我不确定这意味着什么。我还没有找到任何一起使用 wxPython 和 matplotlib 小部件的示例,因此非常感谢任何帮助。

4

1 回答 1

3

结果证明这是一个非常简单的解决方案: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标志,因为它弄乱了颜色;我认为这与此修复无关,但仍需注意。

于 2012-12-25T07:13:41.817 回答