如何使用贡献的C++;wxpython中的wxwidget

如何使用贡献的C++;wxpython中的wxwidget,wxpython,wxwidgets,Wxpython,Wxwidgets,我用wxpython编写了一个小应用程序,其中包括使用matplotlib显示烛台OHLC图。不过,我想用图表的C++组件来提高图表的性能。wxwidgets有一个可用的:它基本上满足了我的需求 有没有一种(简单的)方法可以以与wxpython兼容的方式添加绑定 我没有必要使它非常完整,涵盖所有选项/类/方法-我更希望能够使用非常小的子集 我不想一直走C++路径,因为我想重用我拥有的Python代码,使用脚本……/P> 如果您能为我提供一些网上教程/文档,我将不胜感激。到目前为止,我没有找到任何

我用wxpython编写了一个小应用程序,其中包括使用matplotlib显示烛台OHLC图。不过,我想用图表的C++组件来提高图表的性能。wxwidgets有一个可用的:它基本上满足了我的需求

有没有一种(简单的)方法可以以与wxpython兼容的方式添加绑定

我没有必要使它非常完整,涵盖所有选项/类/方法-我更希望能够使用非常小的子集

<>我不想一直走C++路径,因为我想重用我拥有的Python代码,使用脚本……/P>
如果您能为我提供一些网上教程/文档,我将不胜感激。到目前为止,我没有找到任何方法。

不,我知道没有简单的方法。您可能需要学习wxPython 2.8系列的SWIG和wxPython Phoenix项目的早期2.9或SIP,才能使其正常工作。然而,出于图表的目的,您可能想看看哪些已经可以与wxPython集成。

不,我知道没有简单的方法。您可能需要学习wxPython 2.8系列的SWIG和wxPython Phoenix项目的早期2.9或SIP,才能使其正常工作。但是,为了图表的目的,您可能想看看已经可以与WxPython集成的.< /P> < P>在对WxPython用户组进行大量搜索之后,也从Robin Dunn(在SWIG接口文件中删除析构函数)对C++的关键帮助进行了直接的帮助。(对于当前的WxPython 2.9.4),用于在

中使用的C++类FooButton 因为它可能对那些偶然发现这个问题的人有用(对我来说,让它工作起来是非常重要的),所以我将代码发布在下面

C++头文件<代码> FooButo.H</C> >

class FooButton : public wxButton
{
public:
    FooButton(wxWindow *parent,
              wxWindowID id,
              const wxString& label,
              const wxPoint& pos = wxDefaultPosition,
              const wxSize& size = wxDefaultSize,
              long style = 0,
              const wxValidator& validator = wxDefaultValidator,
              const wxString& name = "foobutton");
    ~FooButton();
private:
    DECLARE_CLASS(FooButton);
};
%module foobutton

%{
#include "wx/wx.h"
#include "wx/wxPython/wxPython.h"
#include "wx/wxPython/pyclasses.h"
class wxPyTreeCtrl;

#include "foobutton.h"
%}

class wxPyTreeCtrl;

%import typemaps.i
%import my_typemaps.i

%import core.i
%import controls.i

%pythoncode { import wx }
%pythoncode { __docfilter__ = wx._core.__DocFilter(globals()) }

class FooButton : public wxButton
{
public:
    FooButton(wxWindow *parent,
              wxWindowID id,
              const wxString& label,
              const wxPoint& pos = wxDefaultPosition,
              const wxSize& size = wxDefaultSize,
              long style = 0,
              const wxValidator& validator = wxDefaultValidator,
              const wxString& name = "foobutton");
//    ~FooButton(); COMMENTING OUT THE DESTRUCTOR IS IMPORTANT !
private:
    DECLARE_CLASS(FooButton);
};
实现
foobutton.cpp

#include <wx/wx.h>
#include "foobutton.h"

IMPLEMENT_CLASS(FooButton, wxButton);

FooButton::FooButton(wxWindow *parent,
          wxWindowID id,
          const wxString& label,
          const wxPoint& pos,
          const wxSize& size,
          long style,
          const wxValidator& validator,
          const wxString& name)
    : wxButton(parent, id, label, pos, size, style, validator, name)
{
    SetLabel("foo");
}

FooButton::~FooButton()
{

};

一些注释:声明<代码>类WXPyTrErrtl; >在 PyCase.H./C>中似乎是缺少的。此外,从SWIG接口擦除C++析构函数非常重要,因为FoeButt对象被立即垃圾回收,并且FooPutt没有在应用程序中出现。(感谢罗宾·邓恩!)

我使用了swig1.3.29和wxPython发行版中应用的补丁

由于构建扩展也不是一件小事,我在下面列出了
Makefile
的内容:

WX_CXXFLAGS = -fpic  `wx-config --cxxflags` -I/home/romuald/software/wxPython-src-2.9.4.0/wxPython/include -DSWIG_TYPE_TABLE=_wxPython_table
WX_LIBS = `wx-config --libs` -lwxcode_gtk2u_freechart-2.9
LIBS =

py: foobutton.o foobutton_wrap.o
    g++ -shared foobutton.o foobutton_wrap.o $(WX_LIBS) $(LIBS) -o _foobutton.so

foobutton.o: foobutton.cpp
    g++ -c -o $@ $(WX_CXXFLAGS) foobutton.cpp

foobutton_wrap.o: foobutton_wrap.cxx
    g++ -c $(WX_CXXFLAGS) -I/usr/include/python2.7 foobutton_wrap.cxx 

foobutton_wrap.cxx: foobutton.i
    wxswig -c++ -python -Wall -nodefault -python -keyword -new_repr -modern -D__WXGTK__ -I/home/romuald/software/wxPython-src-2.9.4.0/wxPython/src foobutton.i

在C++编译器标志中注意<代码> -FPIC和-dSWigyType Type=WxPythOnthTabase< /Cord>选项。上面的扩展编译和FooWutt显示在WxPython应用程序中。关于丢失的析构函数有一个警告消息,但似乎都起作用。RUP和Robin Dunn(在SWIG接口文件中删除析构函数)的直接直接帮助,我成功地获得了用于C++的类FooButton的工作C++扩展(当前WxPython 2.9.4),它在

中使用 因为它可能对那些偶然发现这个问题的人有用(对我来说,让它工作起来是非常重要的),所以我将代码发布在下面

C++头文件<代码> FooButo.H</C> >

class FooButton : public wxButton
{
public:
    FooButton(wxWindow *parent,
              wxWindowID id,
              const wxString& label,
              const wxPoint& pos = wxDefaultPosition,
              const wxSize& size = wxDefaultSize,
              long style = 0,
              const wxValidator& validator = wxDefaultValidator,
              const wxString& name = "foobutton");
    ~FooButton();
private:
    DECLARE_CLASS(FooButton);
};
%module foobutton

%{
#include "wx/wx.h"
#include "wx/wxPython/wxPython.h"
#include "wx/wxPython/pyclasses.h"
class wxPyTreeCtrl;

#include "foobutton.h"
%}

class wxPyTreeCtrl;

%import typemaps.i
%import my_typemaps.i

%import core.i
%import controls.i

%pythoncode { import wx }
%pythoncode { __docfilter__ = wx._core.__DocFilter(globals()) }

class FooButton : public wxButton
{
public:
    FooButton(wxWindow *parent,
              wxWindowID id,
              const wxString& label,
              const wxPoint& pos = wxDefaultPosition,
              const wxSize& size = wxDefaultSize,
              long style = 0,
              const wxValidator& validator = wxDefaultValidator,
              const wxString& name = "foobutton");
//    ~FooButton(); COMMENTING OUT THE DESTRUCTOR IS IMPORTANT !
private:
    DECLARE_CLASS(FooButton);
};
实现
foobutton.cpp

#include <wx/wx.h>
#include "foobutton.h"

IMPLEMENT_CLASS(FooButton, wxButton);

FooButton::FooButton(wxWindow *parent,
          wxWindowID id,
          const wxString& label,
          const wxPoint& pos,
          const wxSize& size,
          long style,
          const wxValidator& validator,
          const wxString& name)
    : wxButton(parent, id, label, pos, size, style, validator, name)
{
    SetLabel("foo");
}

FooButton::~FooButton()
{

};

一些注释:声明<代码>类WXPyTrErrtl; >在 PyCase.H./C>中似乎是缺少的。此外,从SWIG接口擦除C++析构函数非常重要,因为FoeButt对象被立即垃圾回收,并且FooPutt没有在应用程序中出现。(感谢罗宾·邓恩!)

我使用了swig1.3.29和wxPython发行版中应用的补丁

由于构建扩展也不是一件小事,我在下面列出了
Makefile
的内容:

WX_CXXFLAGS = -fpic  `wx-config --cxxflags` -I/home/romuald/software/wxPython-src-2.9.4.0/wxPython/include -DSWIG_TYPE_TABLE=_wxPython_table
WX_LIBS = `wx-config --libs` -lwxcode_gtk2u_freechart-2.9
LIBS =

py: foobutton.o foobutton_wrap.o
    g++ -shared foobutton.o foobutton_wrap.o $(WX_LIBS) $(LIBS) -o _foobutton.so

foobutton.o: foobutton.cpp
    g++ -c -o $@ $(WX_CXXFLAGS) foobutton.cpp

foobutton_wrap.o: foobutton_wrap.cxx
    g++ -c $(WX_CXXFLAGS) -I/usr/include/python2.7 foobutton_wrap.cxx 

foobutton_wrap.cxx: foobutton.i
    wxswig -c++ -python -Wall -nodefault -python -keyword -new_repr -modern -D__WXGTK__ -I/home/romuald/software/wxPython-src-2.9.4.0/wxPython/src foobutton.i

注意C++编译器标志中的> FPIC< -FPIC> -DFigigyType Type=XWyPythOnthTabase<代码>选项。上面的扩展编译和FooWutt显示在WxPython应用程序中。关于丢失的析构函数有一个警告消息,但似乎一切都起作用。十进制高级C++包装(或甚至<代码>外部)C“<代码>包装器”,并为它们编写琐碎的绑定。然后,您可以将图表小部件视为通用的不透明小部件,并调用包装器来完成非通用的工作。这偶尔是值得做的,但通常您最好只是刷一下库。@abarnet和Mike Driscoll:谢谢!在wxPython的上下文中是否有使用SWIG的地方用一些例子来描述,我发现了一些评论,我们必须使用一个特别修补的Sigg版本的WXPython,还有一个教程,但是它在结尾使用了一些过时的结构,实际上我使用的是MatPultLIB,但是想切换到C++的烛台绘图解决方案。(FraseCar)为了执行原因……(而且这种特殊的情节看起来更好)你可能需要查看WXPython的一个构建页面:2.9或2.8。或者你可以在WxPython邮件列表中询问核心DEVS。唯一的替代方案是编写一些最低级别的C++包装(甚至是代码>“C”wrapper),并为它们编写琐碎的绑定。然后,您可以将图表小部件视为通用的不透明小部件,并调用包装器来完成非通用的工作。这偶尔是值得做的,但通常您最好只是刷一下库。@abarnet和Mike Driscoll:谢谢!在wxPython的上下文中是否有使用SWIG的地方我发现了各种各样的评论,人们不得不使用一个专门补丁版本的SWIG for wxpython和一个导师