2

我已经使用 pyBarcode 库在我的软件中生成条形码,当我从命令行加载它时它的工作非常好,但是一旦我使用 py2exe 冻结整个软件,我在生成条形码时遇到 IO 错误。

File "panels.pyc", line 383, in generate
File "barcodeGenerator.pyc", line 9, in generate
File "barcode\base.pyc", line 68, in save
File "barcode\codex.pyc", line 251, in render
File "barcode\base.pyc", line 103, in render
File "barcode\writer.pyc", line 188, in render
File "barcode\writer.pyc", line 280, in _paint_text
File "PIL\ImageFont.pyc", line 248, in truetype
File "PIL\ImageFont.pyc", line 146, in __init__
IOError: cannot open resource

这里panels.py 是我的python 脚本,我从中调用barcodeGenerator.py 的generate 方法,其代码如下。

条码生成器.py:-

import barcode
from barcode import generate
from barcode.writer import ImageWriter
from PIL import PngImagePlugin

def generate(details,path):
  EAN = barcode.get_barcode_class('code128')
  ean = EAN(details, writer=ImageWriter())
  barcodePic = ean.save(path + 'barcode')

是的,使用冻结的 setup.py 文件是:-

from distutils.core import setup
import py2exe

includes = ["HuffmanDictionary"]

setup(
options = {
            "py2exe": {"includes": includes}
          },
console=['MainFrame.py',"extraModules.py","encode.py","decode.py","panels.py","barcodeGenerator.py" ]
)

请指出我犯的错误。我非常接近完成整个软件,这是最后一个错误,我使用的是 Windows 7 64 位。

编辑:已经到过这个链接并尝试过,但仍然不适合我。

4

2 回答 2

3

我在[您的 python 安装目录] \Lib\site-packages\barcode\writer.py中找到了这个

PATH = os.path.dirname(os.path.abspath(__file__))
FONT = os.path.join(PATH, 'DejaVuSansMono.ttf')

DejaVuSansMono.ttf 也在同一目录中。但是,在建立 cx_freeze 之后,条形码编写器给 ImageFont 一个无效的字体路径。

我的解决方法是将 DejaVuSansMono.ttf 复制到Windows\Fonts将运行您构建的可执行文件的 PC 上的 OS 文件夹。

类似问题如何在不指定绝对路径的情况下使用 PIL.ImageFont.truetype 加载字体文件?

另一种解决方法是修改barcode\writer.py

#FONT = os.path.join(PATH, 'DejaVuSansMono.ttf')
FONT = 'arial.ttf'

我认为 arial.ttf 应该在每个Windows\Fonts(默认字体路径)目录中。

于 2016-03-03T14:43:08.627 回答
-1

最后,在深入研究谷歌并在 py2exe 的邮件列表上提出问题后,我意识到 py2exe 中存在一些错误,它只是没有任何理由地不包含某些模块。所以我在 .exe 的文件夹中添加了整个模块作为 include_package 并且作为一个魅力。此外,cx_Freeze 是使用 py2exe 的一个很好的替代方案,因为它易于使用并且在多个平台上受支持。

希望这可以帮助其他浪费时间在互联网上搜索的人。

于 2013-07-15T10:55:51.317 回答