PyInstaller 图标选项不适用于 Mac

PyInstaller icon option doesn't work on Mac

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

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

但是,生成的 .app 文件没有显示图标。

icon.icns被指定为info.plist中的图标文件。

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

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

但是,该图标并未反映在 .app 文件本身中。这是为什么?

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

如果指定正确,icon.icns 将被复制到 Resources 文件夹并应用于 dist 目录中的 testApp.app 包,在 运行 安装 pyinstaller 之后命令。 (不要按照建议尝试 .ico,那是为了 Windows)。

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

鉴于 icon.icns 与 main.py 在同一目录:

你的命令应该是:

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

这将生成应用程序包,您应该可以运行它就好了。


等等,还有更多...

遗憾的是,故事并没有就此结束。

剧透:

要“以正确的方式”做事并让 macOS 开心,您还应该包括:

--osx-bundle-identifier 'YOUR_IDENTIFIER'

这样规范文件将包含生成的 Info.plist 文件的信息。

spec 文件中还应该有一个部分描述 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'
                    }
                ]
            },
         )

在上面的例子中,key/value 'NSPrincipalClass': 'NSApplication' 是允许 Mac OS X 使用视网膜分辨率呈现应用程序所必需的。

'NSAppleScriptEnabled' 被分配了 Python 布尔值 False,它将作为 <false/> 输出到 Info.plist。最后,键 CFBundleDocumentTypes 告诉 Mac OS X 你的应用程序支持什么文件类型,如果有的话。

临时解决方法是在 Finder 中简单地获取 .icns 文件的信息;单击并复制“获取信息”左上角的图像 window;然后将该 .icns 图像粘贴到应用程序的获取信息 window 中的相同位置。您还可以通过该方法将 .icns 图像从任何现有应用程序复制到任何其他应用程序。我相信该功能在 Mac 上已经可用了二十多年。尽管如此,最终还是应该编码成Info.plist内容。