Matplotlib+;wxPython-如何将自定义事件作为matplotlib事件传递?

Matplotlib+;wxPython-如何将自定义事件作为matplotlib事件传递?,python,events,matplotlib,wxpython,Python,Events,Matplotlib,Wxpython,我目前正试图在代码中实现自定义多点触控事件。我当前的代码被模块化并分为三个文件(Main.py、Panel1.py、Panel2.py)。例如,下面是一个简单的工作示例: 面板1.py import matplotlib from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas from matplotlib.backends.backend_wx import NavigationToolba

我目前正试图在代码中实现自定义多点触控事件。我当前的代码被模块化并分为三个文件(Main.py、Panel1.py、Panel2.py)。例如,下面是一个简单的工作示例:

面板1.py

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

import wx
import numpy as np

class Panel1(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        self.figure = Figure()
        self.axes = self.figure.add_subplot(111)
        self.canvas = FigureCanvas(self, -1, self.figure)

        t = np.arange(0.0, 3.0, 0.01)
        s = np.sin(2 * np.pi * t)
        self.axes.plot(t, s)

        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.sizer.Add(self.canvas, 1, wx.LEFT | wx.TOP | wx.GROW)
        self.SetSizer(self.sizer)
        self.Fit()

        self.canvas.mpl_connect('motion_notify_event', self.onHover)

    def onHover(self, event):

        x1 = event.xdata
        y1 = event.ydata

        if event.inaxes == self.axes:
            print "Browsing in Panel 1"
面板2.py

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

import wx
import numpy as np

class Panel2(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        self.figure = Figure()
        self.axes = self.figure.add_subplot(111)
        self.canvas = FigureCanvas(self, -1, self.figure)

        t = np.arange(0.0, 3.0, 0.01)
        s = np.cos(2 * np.pi * t)
        self.axes.plot(t, s)

        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.sizer.Add(self.canvas, 1, wx.LEFT | wx.TOP | wx.GROW)
        self.SetSizer(self.sizer)
        self.Fit()

        self.canvas.mpl_connect('motion_notify_event', self.onHover)

    def onHover(self, event):

        x1 = event.xdata
        y1 = event.ydata

        if event.inaxes == self.axes:
            print "Browsing in Panel 2"
Main.py

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

import wx
import numpy as np

import Panel1 as FirstPanel
import Panel2 as SecondPanel

#MultiTouchHoverEvent, EVT_MULTITOUCH_HOVER = wx.lib.newevent.NewEvent()

class MainFrame(wx.Frame):

    def __init__(self):
        wx.Frame.__init__(self, None, title="Main Frame", size=(600, 600))
        self.SetBackgroundColour('white')

        self.panel_size = (10,10)

        self.InitUI()
        self.Centre()
        self.Show()

    def InitUI(self):

        sizer = wx.GridBagSizer(10, 10)

        self.Panel1 = FirstPanel.Panel1(self)
        sizer.Add(self.Panel1, flag=wx.EXPAND, pos=(0, 0), span=(1, 1))

        self.Panel2 = SecondPanel.Panel2(self)
        sizer.Add(self.Panel2, flag=wx.EXPAND, pos=(0, 1), span=(1, 1))

        sizer.AddGrowableCol(0)
        sizer.AddGrowableCol(1)

        sizer.AddGrowableRow(0)


        #self.Bind(EVT_MULTITOUCH_HOVER, self.multitouch_handler)

        self.SetSizerAndFit(sizer)

if __name__ == '__main__':

    app = wx.App(False) 
    MainFrame()
    app.MainLoop()
现在我已经创建了这个自定义事件
EVT\u multi-touch\u HOVER
,您可以在Main.py代码中看到注释。我可以将它绑定到框架上,当与我的多点触控代码结合时,它可以成功地工作。但是,我想做的是让EVT多点触控悬停覆盖matplotlib
“运动通知事件”
。通过这种方式,我可以在每个面板的
onHover
函数中分别为每个面板指定要采取的适当操作

(Panel1.py, Panel2.py)
我不确定我是否解释得很好,所以如果你有任何问题,请询问

自定义事件可以是任何东西,它不必像我的示例中那样是多点触控事件。但是,为了完整起见,关于多点触控代码,我使用pytuio,并在后台运行名为tongseng的tuio服务器,该服务器通过tuio协议发送与mac上多点触控触摸板的交互。然后我创建了一个类,它运行一个单独的线程,不断监听tuio事件,然后处理信息并调用
wx.PostEvent
,以获得适当的自定义事件(悬停、双击、鼠标释放等)