如何在Python中正确加载数据文件

时间:2015-01-18 02:41:29

标签: python python-2.7 setup.py data-files

所以..我的程序有这个小问题。我可能需要解释一些基本的东西 - 尤其是当通过distutils安装东西时会发生什么。

我在Tkinter制作的GUI应用程序中使用了两个图标。由于它们的位置,我在加载它时遇到问题。

您可以看到我的setup.py文件here。您可以在第28行看到我指定的文件(它们位于子文件夹gui/)。

当然,当您想要运行程序的GUI部分时(可以通过安装它并将其作为flashstudy --gui可执行文件运行),问题就开始了。我在第44行和第44行的文件main.py中收到错误45(文件为here)。无法从该位置加载图像。

我想这很有意义,因为它应该在安装过程中查看文件传输的目录,但我不知道该位置在哪里以及如何轻松加载。

另一件事 - 为什么设置这样的原因是你可以直接从终端运行程序和GUI部分而不安装它,我想保留这个功能。

有办法以某种方式做到这一点吗?

1 个答案:

答案 0 :(得分:2)

如果您使用setuptools而非distutils,则无论数据文件的安装方式如何,您都可以可靠地包含数据文件并在安装后再次加载它们。

您已导入setuptools,但忽略了它;而不是从setup导入distutils.core,而是从setuptools

导入
from setuptools import setup

使用package_datainclude_package_data而非data_files选项添加图片。请参阅setuptools文档中的Including Data Files

package_data = {'gui': ['*.gif']}

然后,您可以使用pkg_resources Resource API加载包数据。对于TKinter PhotoImage对象,您需要一个文件名,因此您可以使用:

icon_up = PhotoImage(
    file=pkg_resources.resource_filename('flashCardStudy', 'gui/up.gif'))

就个人而言,我在源代码中嵌入了一个base64数据字符串,并将其用作图标:

icon_up_data = '''\
    R0lGODlhEAAQAJEAAAAAAP///////wAAACH5BAEAAAIALAAAAAAQABAAAAIflI+pywfQ0ovuQWpv
    y3PzyHVKKErkQlpjqhmsSsVRAQA7
'''
icon_up = PhotoImage(data=icon_up_data)

这完全绕过了整个问题。请注意,这仅适用于GIF图像。