Chinaunix首页 | 论坛 | 博客
  • 博客访问: 125080
  • 博文数量: 19
  • 博客积分: 810
  • 博客等级: 准尉
  • 技术积分: 200
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-14 23:34
文章分类

全部博文(19)

文章存档

2010年(2)

2009年(12)

2008年(5)

我的朋友

分类: Python/Ruby

2009-09-25 11:32:30

      上一篇文章谈到如何让解决Qt中使用jpeg的问题,在我的电脑上,把PyQt4/plugins/imageformats文件夹复制到py2exe打包的可执行文件目录下后,jpeg的验证码显示正常了。可是后来发现copy到别人机器上时,又出现了问题,jpeg格式的验证码还是加载不了,于是又Google之。很多人都遇到过这个问题,说到Qt默认只对png格式支持,对其他图片格式的支持都是通过plugins里面的动态链接库DLL来支持的,所以提出两种办法:
      一就是我上述采用的方法了,将PyQt4/plugins/imageformats文件夹复制到py2exe打包的可执行文件目录下,这在我的电脑上时可以正常work的;
      二是在py2exe打包的可执行文件目录下建立文件夹PyQt4/plugins/imageformats,然后复制PyQt4/plugins/imageformats下的DLL文件到建立的imageformats下,将安装目录下的qt.conf复制到py2exe打包的可执行文件目录下,然后修改之:

[Paths]
Prefix = ./PyQt4
Plugin = ./PyQt4/plugins
Binaries = .

     
      这两种方法在我的电脑上都是可以正常work的,但是复制到别人的机器上就不能work了,jpeg格式的验证码还是无法显示,郁闷之余,终于找到了一个折中的办法:先用PIL(Python Image Library)将jpeg文件转换成png格式的,然后用Qt直接显示png文件的验证码就没问题了。
      不过在转换中还是有问题,就是我的jpeg验证码从url获取的是字符串的格式,如果直接用PIL打需要的是文件或者file对象,所以需要用到StringIO的库,把string转换成文件IO的对象,这样就可以直接用PIL来操作啦,源代码如下:

pixmap = QtGui.QPixmap()
jpgdata = self.qzone.reqVerifCode()  # request url to get jpeg data
strio = StringIO.StringIO(jpgdata)
img = Image.open(strio)
pngdata = StringIO.StringIO()        
img.save( pngdata, format='png')  # convert jpeg to png
bool = pixmap.loadFromData( QtCore.QByteArray(pngdata.getvalue()) )

if bool:
       icon = QtGui.QIcon( pixmap )
       self.veriCodeButton.setIcon( icon )

else:
       QtGui.QMessageBox.warning( None, u'警告',
                    u"加载验证码失败" )


      这下再复制到其他电脑上,肯定不会再出现问题啦,也不用打包plugin那些动态库了。虽然麻烦了一点,但是问题最终得到解决~~撒花!

阅读(3898) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2011-06-18 11:19:28

其实楼主第一种方案稍加改动即可 在 你的 app目录下 建立 plugins/imageformats ,并把 PyQt4/plugins/imageformats下的内容复制到这里。 然后在 app目录下建立 qt.conf 内容为: [Paths] Prefix=.