wxPython GUI:将gnuplot迁移至matplotlib
我现在有一个用wxPython做的图形界面(GUI),里面有几个部分,其中一个部分显示了一张绘图的.png图片:
self.plot = wx.BitmapButton(self.pane_system, -1, wx.Bitmap("/home/myname/projects/newton/plot/src/graph.png", wx.BITMAP_TYPE_ANY))
在这个图形界面的另一个地方,有一个可以编辑参数的区域。当前的设置是,当我更改参数并按下回车键时,代码会告诉Gnuplot重新绘图,并把新的图保存到graph.png文件中,然后更新图形界面以显示更新后的图片。
我有几个一般性的问题:
我想把gnuplot换成matplotlib,原因是:如果我使用gnuplot,运行这个程序的机器上必须安装gnuplot。而matplotlib是一个Python模块,所以我不需要担心在其他机器上安装图形包。这个想法对吗?
我该如何修改我的wxPython图形界面窗口,以显示matplotlib的绘图?我找到了一些教程,告诉我如何创建一个新的面板来显示matplotlib的绘图,但我想要的是让它直接出现在旧的绘图位置。我觉得我可以让matplotlib像在gnuplot中那样,把绘图保存为图片文件。把绘图保存为图片并更新图形界面,这样做一般来说好吗?还是有其他更快的方法来更新绘图?使用图片文件的一个缺点是(如上面的代码所示),当我调整图形界面窗口大小时,它们不会随之改变大小。
如果我把这个打包成一个可执行文件,我是否需要在Windows机器上安装wxPython/Python才能让这个可执行文件运行?
1 个回答
按顺序回答你的问题:
1.) 是的,matplotlib是一个独立的Python模块。它确实有一些外部依赖,但在Windows上,这些依赖会和matplotlib一起打包安装。当你在其他机器上安装时,是否需要担心这些依赖呢?这要看你打算怎么安装。你是要打包成exe文件吗?还是让最终用户自己安装Python和matplotlib?举个例子,你可以用py2exe把matplotlib打包进你的exe文件,具体可以参考这里。当然,你需要根据你的后端wx来定制这些脚本。
2.) 你看到有图表的面板是因为matplotlib提供了一个叫FigureCanvasWxAgg的东西,它是从wxPanel派生的wxWidget,和matplotlib配合得很好。使用它的好处是你可以为一些事情,比如调整大小和绘图,设置处理程序。
不过,你的wxBitMapButton需要一个wxBitmap作为图像。你可以尝试给它一个文件句柄(cStringIO.StringIO)来指向一个matplotlib图表,这样就不需要把文件写入磁盘了。你也可以尝试连接它的调整大小事件,让matplotlib重新绘制图形到合适的大小。不过,使用FigureCanvasWxAgg会更灵活一些。不过我现在无法查找相关信息,因为wxPython的网站似乎无法访问。
3.) 你可以把wxPython打包成可执行文件。具体怎么做取决于你使用的打包工具。我用py2exe做过很多次。