多个wxpython选项卡严重处理matplotlib事件

多个wxpython选项卡严重处理matplotlib事件,python,event-handling,matplotlib,wxpython,Python,Event Handling,Matplotlib,Wxpython,我真的很努力地理解这一点,感觉真是太接近了! 我有一个循环,在这个循环中我创建了一些wxpanel并将它们附加到笔记本选项卡上。每个选项卡都包含一个绘图。最初,绘图上的事件调用没有通过正确的绘图面板,因此事件处理函数报告了错误绘图的位置。我想我会用一句话来解决这个问题: self.plotdict ["plot" + str(plotcounter)] = wx.Panel(self, id=wx.ID_ANY) 然后我可以改变我的函数,让它传递dict键,而不是plot,不管怎样,我

我真的很努力地理解这一点,感觉真是太接近了! 我有一个循环,在这个循环中我创建了一些wxpanel并将它们附加到笔记本选项卡上。每个选项卡都包含一个绘图。最初,绘图上的事件调用没有通过正确的绘图面板,因此事件处理函数报告了错误绘图的位置。我想我会用一句话来解决这个问题:

    self.plotdict ["plot" + str(plotcounter)] = wx.Panel(self, id=wx.ID_ANY)
然后我可以改变我的函数,让它传递dict键,而不是plot,不管怎样,我感觉更好

    self.plotdict ["plot" + str(plotcounter)].canvas.mpl_connect('motion_notify_event', lambda event: self.cbUpdateCursor(event, ("plot" + str(plotcounter))))
但是,即使此循环已运行多次,并且我在选项卡中有许多绘图,循环中的这一行始终向函数self.cbUpdateCursor发送相同的键,就好像它仅使用创建的最后一个选项卡/绘图的函数调用一样

        def cbUpdateCursor(self, event, plot):
    if event.inaxes:
        text = 'x = %5.4f, y = %5.4f' % (event.xdata, event.ydata)
        print text
        print plot
        print self.plotdict[plot]
        print id(self.plotdict [plot])
        self.plotdict [plot].cursor_pos.SetLabel(text)
这意味着来自函数的打印(仅用于测试)显示相同的绘图参考,而不管哪个选项卡以及鼠标事件发生在哪个绘图上

  Print results for mouse over plot1
    x = -127.8006, y = 135.9350
    plot3
    <wx._windows.Panel; proxy of <Swig Object of type 'wxPanel *' at 0x2f63758> >
    52125616
  Print results for mouse over plot2
    x = -185.0618, y = 137.9096
    plot3
    <wx._windows.Panel; proxy of <Swig Object of type 'wxPanel *' at 0x2f63758> >
    52125616
打印鼠标悬停在绘图1上的结果
x=-127.8006,y=135.9350
情节3
52125616
打印鼠标悬停在绘图2上的结果
x=-185.0618,y=137.9096
情节3
52125616

为什么画布上的“我的鼠标”事件会调用与绘图3关联的函数,而不管我的鼠标在哪个绘图上?(本例中的绘图3是最后一个创建的)。

我认为您的问题可能是因为您需要关闭运动通知事件函数。关于闭包,可以找到几个非常好的答案

也许是这样的:

for plot_count in plot_counts:
    def update_plot(event, plot_count=plot_count):
        self.cbUpdateCursor(event, 'plot%s' % plot_count)

    self.plotdict['plot%s' % plot_count].canvas.mpl_connect('motion_notify_event', update_plot)

但是,由于您没有提供绑定调用,我无法测试实际情况。

您是否可以发布相关的
self.Bind()
调用?我似乎没有使绑定调用与此事件句柄相关。我的代码目前很混乱;很抱歉,你需要更多。我用一种方法解决了这个问题,就是“获取”活动页面<代码>代码page=self.nb.GetPage(self.nb.GetSelection())正常。你没能测试我建议的改变的结果吗?佩尔森,我想我也在做同样的事情。我只在循环之外定义一次函数。你的函数在循环中有什么原因吗?很难说,但这就是这个答案的要点:如果我的答案是正确的,那么函数在循环中是重要的。如果您还没有这样做,我强烈建议您阅读我链接到()的闭包问题。