PyInstaller的图标选项在Mac上无效

6

我在我的 Mac 上运行了以下命令,并创建了一个 .app 文件。

pyinstaller --icon icon.icns --noconsole -n testApp main.py

然而,生成的.app文件没有显示图标。

在此输入图像描述

在info.plist中指定了icon.icns作为图标文件。

在此输入图像描述

Content/Resouces文件夹包含icon.icns。

在此输入图像描述

当我运行.app文件时,我在Dock上看到一个图标。

然而,图标并未反映在.app文件本身中。为什么会这样呢?


2
你试过用 .ico 格式的文件而不是 .icns 吗? - Lucan
2
在创建 macOS 的 .app 包时,请勿使用 .ico 文件。它仅支持为 Windows 应用程序创建图标。 - C. Sederqvist
2
是的,Windows 使用“.ico”格式,而 macOS 使用“.icns”格式。 - Legorooj
在Finder中是否有一些设置需要调整? - Legorooj
2个回答

14

您应使用创建macOS应用程序包的命令

如果正确指定,icon.icns将被复制到资源文件夹中,并应用于运行pyinstaller命令后在dist目录下的testApp.app应用程序包中(不要尝试使用像Windows那样的.ico格式)。

我刚刚尝试使用PySide2创建了一个简单的Python应用程序,它没有任何问题地将图标文件包含在应用程序包中。

假设icon.icns与main.py在同一目录中

您的命令应为:

$ pyinstaller --onefile --windowed --icon icon.icns --name testApp main.py

这将生成应用程序包,您应该能够正常运行它。


但是,还有更多内容...

不幸的是,故事还没有完全结束。

剧透警告:

为了以“正确”的方式进行操作,并使macOS感到满意,您还应包括:

--osx-bundle-identifier 'YOUR_IDENTIFIER'

这样,规范文件将包含为生成的Info.plist文件提供信息的数据。

规范文件中还应该有一个描述Info.plist内容的部分,类似于:

app = BUNDLE(exe,
         name='testApp.app',
         icon='icon.icns',
         bundle_identifier='com.youridentifier',
         info_plist={
            'NSPrincipalClass': 'NSApplication',
            'NSAppleScriptEnabled': False,
            'CFBundleDocumentTypes': [
                {
                    'CFBundleTypeName': 'My File Format',
                    'CFBundleTypeIconFile': 'MyFileIcon.icns',
                    'LSItemContentTypes': ['com.example.myformat'],
                    'LSHandlerRank': 'Owner'
                    }
                ]
            },
         )

在上面的例子中,键/值对'NSPrincipalClass': 'NSApplication'是必需的,以便允许Mac OS X使用视网膜分辨率来渲染应用程序。 键'NSAppleScriptEnabled'被分配为Python布尔值False,它将作为输出到Info.plist。最后,键CFBundleDocumentTypes告诉Mac OS X您的应用程序支持哪些文件类型(如果有)。

好的回答!+1,我已经手动授予了悬赏。 - Legorooj
@Legorooj 谢谢!如果原帖关心的话,我会填写更多细节;或者他只是想让他的应用程序启动并显示一个图标! - C. Sederqvist

-2

一个临时解决方法是,在Finder中获取.icns文件的信息;点击并复制获取信息窗口左上角的图像;然后将该.icns图像粘贴到应用程序的获取信息窗口的同一位置。您还可以通过该方法从任何现有应用程序复制.icns图像到任何其他应用程序。我相信这个功能在Mac上已经存在了20多年。尽管如上所述,最终应该将其编码到Info.plist内容中。编辑:获取信息中的.icns图像不得显示默认图像。如果是这样,请在预览中打开.icns图像,复制图像并将其粘贴到您想要的任何获取信息图像中。它在我的iMac上以及复制到另外两台Mac(Mini 2012运行Mojave 10.14.6和Mini运行El Capitan 10.11.6)上都有效。


这对于开发一个(希望能够)在其他人的机器上运行的应用程序来说,根本毫无作用。因此,这不是一个临时解决方案,因为如果没有完成任何其他工作,它就不起作用,完全没有效果。最多只是一个临时的幻觉。 - C. Sederqvist
对我来说它可以运行...... 毫无问题。在3台 Mac 上:一台运行 Mojave 的 iMac,当该应用程序复制到其他两台 Mac 上时:运行 Mojave 10.14.6 的 Mini 2012 和 运行 El Capitan 10.11.6 的 Mini。当在这些“其他人的机器”上运行应用程序时,该应用程序在 Finder 文件、获取信息窗口和 Dock 上保留自定义图标图像。 - mellington

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接