2

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

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

我没有必要让它非常完整并涵盖所有选项/类/方法 - 我宁愿希望能够只使用一个非常小的子集。

我不想一路走 C++ 路线,因为我想重用我拥有的 python 代码并使用脚本......

对于网络上一些教程/文档的任何指针,我将不胜感激。到现在都没找到。。

4

2 回答 2

3

经过对 wxPython-users 组的大量搜索以及 Robin Dunn 对该列表的重要直接帮助(删除 SWIG 接口文件中的析构函数)后,我设法获得了一个有效的 C++ 扩展(适用于当前的 wxPython 2.9.4) 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 应用程序中。有一条关于缺少析构函数的警告消息,但一切似乎都有效。

于 2013-06-29T16:12:47.857 回答
1

不,我知道没有简单的方法。您可能必须为 wxPython 2.8 系列和早期 2.9 学习 SWIG 或为 wxPython Phoenix 项目学习 SIP 以使其正常工作。但是,出于制图的目的,您可能想看看已经可以与 wxPython 集成的matplotlib 。

于 2013-06-13T20:20:16.533 回答