如何在 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_data
或 include_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 图片。
所以..我的程序有这个小问题。我可能需要解释一些基本的东西——尤其是当通过 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_data
或 include_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 图片。