pyqt jpeg support not working in bundled form

2019-08-18 07:13发布

To enable jpeg support in a PyQT application, you have to manually include the qjpeg4.dll.
It works fine when the dll and pyd file are not bundled together in the final exe. For example with py2exe you can do the following :

DATA=[('imageformats',['C:\\Python26/Lib/site-packages/PyQt4/plugins/imageformats/qjpeg4.dll'])]
setup(console=[{"script":"cycotic.py"}], 
    data_files = DATA,
    options={"py2exe":{
        "includes":["sip"],
        "excludes":MODULE_EXCLUDES,
        "bundle_files":3,
        "compressed":False,
        "xref":True}}, 
    zipfile=None)

However, if you do the same thing, and you bundle the dll in the exe (using "bundle_files":1), it fails with the following message :

QObject::moveToThread: Current thread (0x3a16608) is not the object's thread (0x
2dddaf8).
Cannot move to target thread (0x2dddaf8)

QObject::moveToThread: Current thread (0x3a16608) is not the object's thread (0x
2dddaf8).
Cannot move to target thread (0x2dddaf8)

QObject::moveToThread: Current thread (0x3a16608) is not the object's thread (0x
2dddaf8).
Cannot move to target thread (0x2dddaf8)

QPainter::begin: Paint device returned engine == 0, type: 3
QPainter::end: Painter not active, aborted
QPixmap::scaled: Pixmap is a null pixmap

How can I bundle the application properly ?

2条回答
对你真心纯属浪费
2楼-- · 2019-08-18 07:51

I've got the same problem, As I know, py2exe has provided the clue: http://www.py2exe.org/index.cgi/Py2exeAndPyQt

It reads: ......so you'll need to copy the folder PyQt4\plugins\imageformats to \imageformats. ....... This won't work with bundle_files on. ... *This will work with bundle_files as well, but you need to exclude the Qt DLLs from bundle (using the dll_excludes option) and add them to the directory with the executable through some other mechanism (such as data_files).*

following is my setup options, like this:

    zipfile=None,
    options = { "py2exe" :{
                           "compressed":1,
                           "includes": my_includes,                           
                           "packages": my_packages,
                           "optimize":2,
                           "bundle_files":1,
                           "dll_excludes":["QtCore4.dll","QtGui4.dll","QtNetwork4.dll"]
                           }}

So the dist folder consists these files (in my case):

  • imageformats (folder, include qt plugin dll to deal with images)
  • QtCore4.dll
  • QtGui4.dll
  • QtNetwork4.dll
  • MyExeFile.exe
  • w9xpopen.exe

that's all

查看更多
成全新的幸福
3楼-- · 2019-08-18 08:11

Try adding pyqt4 as a package to force py2exe to include everything from PyQT in your build, like this:

options={"py2exe":{
        "includes":["sip"],
        "excludes":MODULE_EXCLUDES,
        "packages":["PyQt4"],
        "bundle_files":1,
        "compressed":False,
        "xref":True}}
查看更多
登录 后发表回答