【问题标题】:How to use a contributed C++ wxwidget in wxpython如何在 wxpython 中使用贡献的 C++ wxwidget
【发布时间】:2013-06-12 12:08:38
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: wxpython wxwidgets


    【解决方案1】:

    在 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);
    };
    

    一些 cmets:声明 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 应用程序中。有一条关于缺少析构函数的警告消息,但似乎一切正常。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 唯一的另一种选择是编写一些最小的高级 C++ 包装器(甚至extern "C" 包装器),并为它们编写简单的绑定。然后,您可以将图表小部件视为通用不透明小部件,并调用包装器来执行非通用操作。这偶尔值得这样做,但通常你最好只是 SWIGging 库。
      • @abarnet 和 Mike Driscoll:谢谢!是否有一些地方通过一些示例描述了在 wxPython 的上下文中使用 SWIG 的地方?我发现各种 cmets 必须为 wxpython 使用专门修补的 SWIG 版本,还有一个教程 link,但最后有一些 cmets 它使用了几个过时的构造......
      • 事实上,我使用的是 matplotlib - 但出于性能原因,我想切换到烛台图表 (freechart) 的 C++ 解决方案..(而且这种特殊的绘图看起来更好)
      • 您可能需要查看 wxPython 构建页面之一:wxpython.org/builddoc.php 用于 2.9 或 wxpython.org/BUILD-2.8.html 用于 2.8。或者你可以在 wxPython 邮件列表中询问核心开发人员在哪里。
      猜你喜欢
      • 2010-12-24
      • 1970-01-01
      • 1970-01-01
      • 2011-04-07
      • 2021-05-05
      • 1970-01-01
      • 1970-01-01
      • 2010-12-10
      • 2011-12-24
      相关资源
      最近更新 更多