所以..我的程序有这个小问题。我可能需要解释一些基本的东西 - 尤其是当通过distutils安装东西时会发生什么。
我在Tkinter制作的GUI应用程序中使用了两个图标。由于它们的位置,我在加载它时遇到问题。
您可以看到我的setup.py
文件here。您可以在第28行看到我指定的文件(它们位于子文件夹gui/
)。
当然,当您想要运行程序的GUI部分时(可以通过安装它并将其作为flashstudy --gui
可执行文件运行),问题就开始了。我在第44行和第44行的文件main.py
中收到错误45(文件为here)。无法从该位置加载图像。
我想这很有意义,因为它应该在安装过程中查看文件传输的目录,但我不知道该位置在哪里以及如何轻松加载。
另一件事 - 为什么设置这样的原因是你可以直接从终端运行程序和GUI部分而不安装它,我想保留这个功能。
有办法以某种方式做到这一点吗?
答案 0 :(得分:2)
如果您使用setuptools
而非distutils
,则无论数据文件的安装方式如何,您都可以可靠地包含数据文件并在安装后再次加载它们。
您已导入setuptools
,但忽略了它;而不是从setup
导入distutils.core
,而是从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图像。