在上篇文章末尾中将barcode
打包为.exe
后,运行软件会报错:can not open resource
出现这个问题的原因是barcode
找不到默认字体,barcode
的默认字体在安装目录下
解决方案为:将字体文件复制出来,然后重新指定路径
writer = ImageWriter()
writer.font_path = 'data/DejaVuSansMono.ttf' #将字体文件放在与代码同目录下的data文件中
ean = barcode.get('code128', 'content', writer=writer)
ean.save(path, options)
关于解决方案的分析
为什么要分析这个bug嘞,因为我在网上搜的时候,网上的方案行不通,我就只能自己分析了。网上有两种方案,第一种将默认字体文件移动到 C:/Windows/Fonts
下,我尝试之后不可行,我怀疑的原因是:将默认字体文件移动进来后名字改变了,如下图所示多加了几个空格,导致识别不到。
第二种也是将默认的字体文件移动到软件目录下,但是操作代码不对,应该是我和他barcode
版本不一样导致的,于是乎我就必须自己找解决方案了。
首先,我先尝试修改C:/Windows/Fonts
下的字体文件名字,修改失败了。于是就只能读barcode
源码,看看能不能找到蛛丝马迹,索性不难找,接下来把方法总结总结。
首先看源码文件,知道了我的版本是0.13.1
既然是字体出问题了,那就肯定和字体文件名字挂钩,于是我就在所有文件里面搜索DejaVuSansMono
,然后就在writer.py
中发现了相关代码,顺带发现了参数font_path
按图索骥,分析font_path
是属于BaseWriter
,而在制作条形码的代码中的ImageWriter
是继承BaseWriter
的子类,这样修改就很简单了,直接实例ImageWriter()
,然后修改参数font_path
就行!
writer = ImageWriter()
writer.font_path = 'data/DejaVuSansMono.ttf' #将字体文件放在与代码同目录下的data文件中
ean = barcode.get('code128', 'content', writer=writer)
ean.save(path, options)