最近我在写一个自用小工具时用了 embed python 的方案,C++端用了[pybind11](
https://github.com/pybind/pybind11) 和 wxWidgets,pybind11 好处是用模板元编程封装好了 python C API 调用,很适合面向对象。[项目地址在这](
https://github.com/czastack/wxFEFactory) ,希望对 LZ 有帮助,还没时间把 GUI 部分单独抽取出来,也没写文档,有 C++基础的话直接看看源码。这个项目还在开发中,也只在 VS 下测试过,可能有些内存泄漏的问题,但可以提供个思路,PS: 很多想法有参考 Sublime Text。
编译后 C++是主体,在里面初始化好 python 环境,再调用一个外部 python 文件作为入口。python 可以用 dll 方式链接,像 sublime text 那样,也可以静态链接到主程序里。用这个方案的原因是 Electorn, qt 这样方案对我来说略大,pyqt, wxPython 同理,且之前我用 wxPython Phoenix 的 wxPropertyGrid 有 crash 的情况,最后决定自己折腾,用 C++封装,release 编译后全部内容能控制在 6M 左右。其中还仿照 RN 的写法,用字典存放样式,现在只实现了几个简单的样式。
python 中调用类似这样
```python
class MainFrame:
def __init__(self):
self.render()
if hasattr(app, 'project'):
self.onOpenProject(app.project)
def render(self):
with ui.MenuBar() as menubar:
with ui.Menu("文件"):
with ui.Menu("新建"):
ui.MenuItem("新建工程\tCtrl+Shift+N", onselect=self.newProject)
ui.MenuItem("退出\tCtrl+Q", onselect=self.closeWindow)
with ui.Menu("视图"):
ui.MenuItem("切换控制台\tCtrl+`", onselect=self.toggleConsole)
with ui.Window("火纹工厂", style=winstyle, styles=styles, menuBar=menubar) as win:
with ui.AuiManager(key="aui"):
ui.AuiItem(ui.ToolBar().addTool("123", "1234", "", self.onselect).realize(), direction="top", captionVisible=False)
ui.AuiItem(ui.ListBox(options=modules, values=lambda x: x, onselect=self.onNav), captionVisible=False)
ui.AuiItem(ui.AuiNotebook(key="book"), direction="center", maximizeButton=True, captionVisible=False)
winstyle = {
'width': 1200,
'height': 960,
}
styles = {
'type': {
},
'class': {
'fill': {'flex': 1},
'expand': {'expand': True},
'console-input': {
'expand': True,
'flex': 1,
},
'console-input-multi': {'height': 70},
'btn-sm': {'width': 30,}
}
}
```
效果如下
![效果](
http://othrhighg.bkt.clouddn.com/20170722202216.png)