使用 pygame 在 cx_Freeze 中包含整个文件夹

Posted

技术标签:

【中文标题】使用 pygame 在 cx_Freeze 中包含整个文件夹【英文标题】:Include entire folders in cx_Freeze with pygame 【发布时间】:2020-07-04 10:46:43 【问题描述】:

我一直在关注如何为 pygame 文件夹进行 cx_freeze 设置的教程。这是我想出的...

import cx_Freeze
executables = [cx_Freeze.Executable("mainGame - Copy.py")]
cx_Freeze.setup(
    name = "Cave",
    version = "1.0",
    author = "Owen Pennington",
    options = "build_exe": "packages":["pygame"], "include_files":["floor_heart.wav"],
    executables = executables
    )

但是我的其余文件都在文件夹中。然后这些文件夹里面有文件夹。例如,我有一个文件夹(路径目录)C:CaveGame\Sprites,该文件夹包含许多其他文件夹,C:CaveGame\Sprites\FloorsC:CaveGame\Sprites\Lava 等...然后我还有一个文件夹 C:CaveGame\Music,其中包含我所有的音乐文件和音效.我怎样才能让这些都在设置中工作???

【问题讨论】:

这能回答你的问题吗? How can I include a folder with cx_freeze? 我不知道在包含 pygame 包的同时包含文件的确切代码:/ 但它有帮助 【参考方案1】:

您只需在options 字典中包含上级目录项:

setup(name='Widgets Test',
      version = '1.0',
      description = 'Test of Text-input Widgets',
      author = "Fred Nurks",
      options =  "build_exe": "packages":["pygame"], "include_files":["assets/", "music/"]  ,
      executables = executables
      )

上面的示例将包括文件assets/images/blah.pngmusic/sounds/sproiiiing.ogg 以及它们的正确目录。 该***文件夹下的所有内容都被拉入lib/

当您加载这些文件时,有必要计算出文件的确切路径。但是执行此操作的常规方法不适用于 cxFreeze。参考https://cx-freeze.readthedocs.io/en/latest/faq.html的FAQ~

if getattr(sys, 'frozen', False):
    EXE_LOCATION = os.path.dirname( sys.executable ) # frozen
else:
    EXE_LOCATION = os.path.dirname( os.path.realpath( __file__ ) ) # unfrozen

显然,您需要模块 sysos.path

然后在加载文件时,用os.path.join确定完整路径:

my_image_filename = os.path.join( EXE_LOCATION, "assets", "images", "image.png" )
image = pygame.image.load( my_image_filename ).convert_alpha()

编辑:如果您在 Windows 下构建,您还需要包含 Visual C 运行时:https://cx-freeze.readthedocs.io/en/latest/faq.html#microsoft-visual-c-redistributable-package。将include_msvcr 添加到options

options =  "build_exe":  "include_msvcr", "packages":["pygame"] #... 

【讨论】:

以上是关于使用 pygame 在 cx_Freeze 中包含整个文件夹的主要内容,如果未能解决你的问题,请参考以下文章

如何在 cx_freeze 中包含一个文件夹?

如何在 cx_freeze 中包含一个文件夹?

如何在 cx_freeze 中包含一个文件夹?

如何在 cx_freeze 中包含一个文件夹?

如何在 cx_freeze 中包含一个文件夹?

如何在 cx_freeze 中包含一个文件夹?