py2exe 进程中的 Tkinter 图像

Tkinter images in py2exe process

我正在用 tkinter 编写一个小部件来模拟一些搜索栏(比如 google / champion select 等) 在小部件中有一些图像。 这些图像位于我的文件 .py 所在的同一文件夹中 他们的路径是 C:\Users\HANZO\Desktop\tools\google.gif 等。 到这里程序按预期工作

现在我尝试通过 py2exe 获取 .exe setup.py:

from distutils.core import setup
import py2exe

Mydata_files = [('images', ['C:\Users\HANZO\Desktop\tool\google.gif'], ['C:\Users\HANZO\Desktop\tool\champ.gif'])]

setup(
windows = [
    {

        "script": "multisearch.py",
        "icon_resources": [(1, "search.ico")]
    }
],
data_file=Mydata_files,
)

当我 运行 exe 时它 运行 是预期的,但是如果我把整个 dist 文件夹移动到另一台计算机,.exe 文件会给我一个错误,说它找不到路径 c:\user\HANZO\desktop\tool\google.gif

很明显,如果它仍然使用旧路径,就会给我错误。我假设我的 setup.py 将图像包含在 lib 文件夹或类似的文件夹中。 我是 py2exe 和 tkinter 的菜鸟。

我应该如何处理这些图像?

打算写一个答案,详细说明您可以采取的一些路线,因为在我看来,评论部分很难做到这一点。

您可以采取的一种方法是不指定完整路径,就像您在安装脚本中所做的那样,因为当传输到另一台计算机时,这将不起作用,因为路径将不相同,因为您我们已经硬编码了计算机的特定路径,而不是指定任意路径。我将在稍后介绍如何做到这一点。因此,您可以将脚本更改为此,因为您已经声明图像与脚本位于 相同的 目录中。

from distutils.core import setup
import py2exe

setup(
    windows = [
    { "script": "multisearch.py", "icon_resources": [(1, "search.ico")]}] )

因为这只会将您的脚本编译成 运行 能够 .exe。现在,在您的脚本中,如果您可以更改,我假设您仍然指定完整路径,图像的完整路径简单地说 google.gif 因为这将在脚本的当前工作目录中查找图像。现在,在编译之后,您可以简单地将图像复制到与编译应用程序相同的目录中,它仍然可以正常工作。

或者,如果您想指定完整路径,您可以执行如下操作。如果您不介意使用内置的 ossys 模块。

PATH = os.listdir(os.path.dirname(os.path.abspath(sys.argv[0])))

你可以阅读我昨天发布的一个类似问题,关于为什么它是 sys.argv[0] 而不是 __file__。因此,如果图像仍在 same 目录中,您可以使用它作为完整路径,但我觉得它有点乱。或者,如果您在子文件夹等中有图像,您可以遍历目录。

然后在你的 setup.py 脚本中你可以做类似下面的事情来抓取所有说 .gif 图像并将它们包含在编译过程中。

image_files = []
for files in PATH:
    if files.endswith('.gif'):
        image_files.append(files)

现在您可以在脚本中执行此操作以包含上面找到的所有 .gif 图片。

setup(
      windows = [
     { "script": "multisearch.py","icon_resources": [(1, "search.ico")]}],
     data_file=image_files,
     )