【问题标题】:X11 Tkinter + PIL + py2app = IOError cannot identify image fileX11 Tkinter + PIL + py2app = IOError 无法识别图像文件
【发布时间】:2013-02-17 19:29:50
【问题描述】:

我尝试导出到 py2app 的 python 程序(python 2.7.3、X11 Tkinter、py2app 0.6.4、MacOS X 10.7.4)有问题。该问题仅在程序的独立 py2app-ified 应用程序版本中开始出现。当我运行创建应用程序的python源文件时,问题不存在,所以我觉得它必须与py2app导出有关。

问题:当我启动 GUI 时,我第一次尝试加载有效的图像文件时,图像加载失败,并且我从 PIL Image 模块收到以下错误:

File "Image.pyc", line 1980, in open
IOError: cannot identify image file

当我然后(不关闭 GUI 或任何东西)尝试打开 完全相同的文件时,它加载完美,没有错误或问题。每次尝试使用任何图像文件都会发生这种情况-第一次尝试加载失败,随后的尝试成功。我应该补充一点,在第一个错误之后,没有图像文件无法加载 - 即使它们与第一个不同。

几点说明: - 图像文件是一个序列,并且非常大(大约 300 MB),所以为了加快加载过程,我使用了 mmap。我试过去掉mmap步骤,直接把一个普通的文件对象交给ImagePIL。直接打开,问题不受影响。
- 在将文件提供给 ImagePIL.open 之前,我还尝试寻找文件的开头,但这没有效果。 - py2app 设置文件非常普通 - 它只包含一些配置文件和一个图标。

这里是有问题的图片加载功能的相关部分:

import Image as ImagePIL
import mmap as m
...
...
def loadImage(self):
    errorLog.debug("Attempting to open image \""+self.filenameVar.get()+"\"")
    try:
        if self.fileMap is not None:
            self.fileMap.close()
        imageFile = open(self.filenameVar.get(), 'r')
        self.fileMap = m.mmap(imageFile.fileno(), 0, prot=m.PROT_READ)
#       self.fileMap.seek(0)
        self.imageSeries = ImagePIL.open(self.fileMap)
        imageFile.close()
    except(IOError):
        errorLog.exception("Failed to open image \""+self.filenameVar.get()+"\"")
        return

我很困惑 - 有什么想法吗?提前致谢!

编辑:我应该补充一点,Tkinter、PIL 和 py2app 是使用 MacPorts 2.1.2 安装的,这很有帮助。

【问题讨论】:

  • 你真的在 OSX 下使用 Tkinter 和 X11 吗?运行python setup.py py2app -A(注意-A)后是否有效?
  • @mmgp:我刚刚尝试用py2app在别名模式下构建我的程序,并没有出现问题!!!它完美地工作。为什么会这样? 你知道我怎样才能让它在部署模式下工作?谢谢!!哦,是的,我真的在 OSX 上使用 Tkinter X11。我最近发现有一个在 OSX 中使用原生窗口的 Tkinter 版本,并打算切换到该版本,但还没有。
  • 我猜想加载特定图像格式所需的其他库没有被包含/找到。我相信您仍然可以加载 bmp 图像,但如果猜测正确,则 png 图像会失败。看到有人反映PIL和py2app结合时出现问题,搜索一下。
  • @mmgp:我会尝试,虽然实际上相同的图像文件第一次加载失败,然后下一次加载成功,所以我不明白它怎么可能是库包含问题。感谢您的帮助!
  • 我没看到,所以你可以忽略那部分评论。

标签: python tkinter python-imaging-library py2app ioerror


【解决方案1】:

似乎 py2app 没有将 PIL 的图像插件包含到应用程序包中,即使其中一个 py2app 配方试图确保它们被包含在内。

您可以尝试的一件事是使用“python setup.py py2app --packages=PIL”构建,然后使用“import PIL.Image as ImagePIL”来使用它。

我还不明白为什么 PIL 配方不起作用,这可能是 MacPorts 构建 python 包的方式(我自己不使用 MacPorts)。

【讨论】:

  • 感谢您的回答 - 不幸的是,这并没有解决问题。还是被这个给难住了!喜欢有更多的答案 - 有人有其他想法吗?
【解决方案2】:

问题是Pillow 3.0.0版本和py2app不一致造成的。

我建议两种解决方案来避免 PIL(枕头)

  1. 使用 opencv 代替 PIL。
  2. 卸载当前版本的 Pillow 并安装以前的版本,如 1.7.8

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 2023-03-08
    相关资源
    最近更新 更多