我在wxpython中写了一个小应用程序,其中包括使用matplotlib显示烛台OHLC图。但是我想使用编译的C ++组件来提高图表的性能。有一个可用于wxwidgets:freechart基本上可以做我想要的。
是否有(简单)方法以与wxpython兼容的方式添加绑定?
我没有必要使它完整并涵盖所有选项/类/方法 - 我宁愿只能使用一小部分。
我不想一直使用C ++路由,因为我想重用我拥有的python代码并使用脚本...
如果您对网络上的某些教程/文档有任何指示,我将不胜感激。到目前为止我没有找到任何东西..
答案 0 :(得分:3)
经过大量搜索wxPython-users组以及Robin Dunn对该列表的重要直接帮助(删除SWIG接口文件中的析构函数)后,我设法获得了一个有效的C ++扩展(对于当前的wxPython 2.9)。 4)对于tutorial on wiki.wxpython.org
中使用的示例C ++类FooButton因为对于偶然发现这个问题的人来说可能是有用的(对我而言,让它运作起来相当重要)我将发布以下代码。
C ++头文件foobutton.h
是
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);
};
实施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()
{
};
SWIG接口文件foobutton.i
是
%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);
};
一些评论:声明class wxPyTreeCtrl;
是必要的,因为它似乎在pyclasses.h
中缺失。从SWIG接口擦除C ++析构函数非常重要,因为FooButton对象被迅速垃圾收集并且FooButton没有显示在应用程序中(感谢Robin Dunn!)。
我使用swig 1.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
和-DSWIG_TYPE_TABLE=_wxPython_table
选项。通过上面的扩展编译和FooButton显示在wxPython应用程序中。有关于遗漏的析构函数的警告信息,但一切似乎都有效。
答案 1 :(得分:1)
不,我没有简单的方法。您可能需要为wxPython 2.8系列学习SWIG,为wxPython Phoenix项目学习早期2.9或SIP以使其正常工作。但是,出于图表目的,您可能需要查看可以与wxPython集成的matplotlib。