刚开始看wxPythonInAction时就发现了这个问题:照着教程的例子抄的代码运行时却提示出错,说No module named images,意思就是说找不到images这个模块,当然例子也不能运行,因为例子代码中用到了images,像例8.11中的:
self.bmp = images.getVippiBitmap()
真是一件比较郁闷的事情,在网上搜了很多,都不得要领,很多人说把
import images
改成:
from wx.lib import pydocview as images
或
import wx.py.images as images
事实证明都不行,今天在网上得到了点儿提示,找到了原因和相应的解决办法,记录如下:
首先images这个模块在标准库里是不存在的,它的实现在wxPython的Demo程序里,而wxPythonInAction的许多例子都是从Demo代码中直接找来的,所以如果照抄的话就会出现上面所说的错误。那images这个模块到底是作什么的呢?其实它只是负责载入图片并转成位图对象(Bitmap)而已,比如说上面的images.getVippiBitmap()就是将Demo自带的Vippi.png图片载入并转成Bitmap对象(可以这样理解,但事实上是images.getVippiBitmap()这个函数没有载入图像,它直接在代码里写的图像数据)。
知道原因就比较容易解决了,最直接的办法当然是直接将images.py拷到python的PATH里,然后导入就不会出错了,我不推荐这种方式,载入图片并转成bitmap对象很容易实现,有wx.Image和wx.Bitmap两种方式可以选择,下面分别介绍。
以例8.11为例,首先找一幅图片放在任意目录并重命名为vippi.jpg(图片格式随便)
用wx.Image实现:
将程序开始的import images删掉,然后将self.bmp = images.getVippiBitmap()该为self.imgdata = wx.Image('path/vippi.jpg', type=wx.BITMAP_TYPE_JPEP) #path为vippi.jpg所在路径
self.bmp = self.imgdata.ConvertToBitmap()
也可以直接写成self.bmp = wx.Image('path/vippi.jpg', type=wx.BITMAP_TYPE_JPEG).ConvertToBitmap()
然后就可以顺利运行了。
用wx.Bitmap实现:
上面那种方法中先创建了图像对象,然后转成位图对象,这个方法是直接创建位图对象,相应的代码为self.bmp = wx.Bitmap('path/vippi.jpg', type=wx.BITMAP_TYPE_JPEG)
这样也可以运行的,不过wxPython的文档里说Bitmap支持的图片格式没有wx.Image多,所以上面那种方式适用性更广。
另外,其实wx.Bitmap还有一个wx.BitmapFromImage(image, depth=- 1)构造函数,这样在方法一中还可以用self.bmp = wx.BitmapFromImage(self.imgdata, -1)来代替self.bmp = self.imgdata.ConvertToBitmap()。