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

How to properly load data files in Python

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

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

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

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

我想这是有道理的,因为它应该查看安装过程中传输文件的目录,但我不知道那个地方在哪里以及如何轻松加载它。

另一件事 - 这样设置的原因是您可以 运行 直接从终端 运行 程序和 GUI 部分而无需安装,我想保留该功能。

有什么办法可以做到这一点吗?

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

您已经导入 setuptools 但忽略了它;而不是从 distutils.core 导入 setup,而是从 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 图片。