我在我的 Mac 上运行了以下命令并创建了一个 .app 文件。
pyinstaller --icon icon.icns --noconsole -n testApp main.py
但是,生成的 .app 文件不显示图标。
icon.icns 被指定为 info.plist 中的图标文件。
Content/Resouces 文件夹包含 icon.icns。
当我运行 .app 文件时,我在 Dock 上看到一个图标。
但是,该图标不会反映在 .app 文件本身中。为什么是这样?
我在我的 Mac 上运行了以下命令并创建了一个 .app 文件。
pyinstaller --icon icon.icns --noconsole -n testApp main.py
但是,生成的 .app 文件不显示图标。
icon.icns 被指定为 info.plist 中的图标文件。
Content/Resouces 文件夹包含 icon.icns。
当我运行 .app 文件时,我在 Dock 上看到一个图标。
但是,该图标不会反映在 .app 文件本身中。为什么是这样?
您应该使用该命令来创建 macOS 应用程序包
如果指定正确,将在运行 pyinstaller 命令icon.icns后将其复制到 Resources 文件夹并应用于目录中的testApp.app包。dist(不要按照建议尝试 .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。
规范文件中还应该有一个部分描述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,它将作为 .plist 输出到 Info.plist <false/>。最后,密钥CFBundleDocumentTypes告诉 Mac OS X 您的应用程序支持哪些文件类型(如果有)。
一个临时的解决方法是在 Finder 中简单地获取 .icns 文件的信息;单击并复制“获取信息”窗口左上角的图像;然后将该 .icns 图像粘贴到应用程序“获取信息”窗口上的相同位置。您还可以通过该方法将 .icns 图像从任何现有应用程序复制到任何其他应用程序。我相信这个功能在 Mac 上已经存在了二十多年。尽管如此,最终还是应该将其编码到 Info.plist 内容中。