在我的Python Qt应用程序中将Mac OSX应用程序菜单栏项设置为“Python”以外的其他项

2024-09-23 20:28:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用python和Qt编写一个GUI应用程序。当我在Mac上启动应用程序时,屏幕顶部Mac菜单栏中的第一个菜单项是“Python”。我更喜欢那里的应用程序名而不是我的应用程序名。我怎样才能把我的程序名写上去?

下面的演示程序创建了一个包含两个菜单的窗口:“Python”和“Foo”。我不喜欢这样,因为无论我是用python还是COBOL编写应用程序,对我的用户都没有区别。取而代之的是菜单“我的应用程序”和“Foo”。

#!/usr/bin/python

# This example demonstrates unwanted "Python"
# application menu name on Mac.

# Makes no difference whether we use PySide or PyQt4
from PySide.QtGui import *
# from PyQt4.QtGui import *

import sys

app = QApplication(sys.argv)
# Mac menubar application menu is always "Python".
# I want "DesiredAppTitle" instead.
# setApplicationName() does not affect Mac menu bar.
app.setApplicationName("DesiredAppTitle")
win = QMainWindow()
# need None parent for menubar on Mac to get custom menus at all
mbar = QMenuBar()
# Add a custom menu to menubar.
fooMenu = QMenu(mbar)
fooMenu.setTitle("Foo")
mbar.addAction(fooMenu.menuAction())
win.setMenuBar(mbar)
win.show()
sys.exit(app.exec_())

如何更改Mac上的应用程序菜单名?编辑:如果可能的话,我希望继续使用系统python(或者用户路径上的任何python)。


Tags: 用户import程序app应用程序fooapplicationmac
3条回答

您似乎需要一个OSX.app才能正常工作,因为其中的Info.plist文件包含放在那里的应用程序的用户可见名称。这默认为Python,这是您在程序菜单中看到的标题。This blog文章概述了需要采取的步骤,而OSX Developer Library则在属性列表中包含了需要填写的文档。

如果您打算分发应用程序,那么python二进制文件的符号链接就不能保证工作,因为通常在开发机器上,系统python不是默认的python,普通用户很可能不会安装Qt和PyQt。

一个更可靠的方法是使用一个本地OSX引导二进制文件来启动PyQt应用程序。py2appPyInstaller都可以生成本机包装器。虽然py2app对于创建一个别名为应用程序很有效,即一个包装器,它可以符号链接到系统上的现有文件,使它只绑定所需的PyQt依赖项,但事实证明这并不简单。此外,如果将py2app生成的带有--aliased标志的“别名应用”移动到另一个文件夹,则它将停止工作,因为符号链接是相对于最初运行生成脚本的文件夹的。

PyInstaller安装程序

PyInstaller开箱即用,最后我得到了一个OSX包,其中包含了16MB左右的依赖项。

将python脚本绑定到独立的OSX应用程序:

pyinstaller -w --noconfirm -i=myappicon.icns --clean -F myscript.py

这将生成一个独立的捆绑包,在OSX标题栏中以应用程序名的形式显示.setWindowTitle()中的所有内容。-w开关非常重要,因为它将使用正确的.plist文件创建一个MacOS应用程序包。

注意:由于某些原因,通过pip安装的pyinstaller版本对我不起作用。所以我删除了最初的pip版本(pip uninstall pyinstaller),并安装了最新的^{} branch from github,其中:

pip install -v -e git+https://github.com/pyinstaller/pyinstaller.git@develop#egg=pyinstaller-github

在那之后,它就像一个符咒。

Mac自动机

创建应用程序包装的另一个选项是使用Automator(在Spotlight中键入名称),转到File>;New>;Application>;搜索并将Run shell script拖到编辑器中,然后在shell下选择bashpython。您还可以使用运行apple script并使用apple脚本引导您的应用程序-如果您需要(例如)询问用户的密码以便以提升的权限运行,这将非常有用。

Automator的一个更好的替代品是Platypus-一个免费的开源应用程序,它将各种类型的脚本打包到OSX应用程序中,并且还提供一些额外的功能,如gui文本输出窗口、以管理员权限运行、设置自定义图标等。这些代码在github上可用。

还可以选择在Xcode中创建一个barebones OSX应用程序,它将启动PyQt脚本(例如here),并执行应用程序所需的其他自定义任务。

NOTE: Keep in mind that an app bundle that calls your python code with a predefined interpreter is a 'shallow' app bundle, and will depend on whatever python dependencies you have install locally. Most likely will not work OOTB on someone else's Mac.

努伊特卡

您可能还想尝试Nuitka(^ {CD11>}),它旨在通过将Python代码转换为C++并编译它来构建真正的本地可执行文件。

使用nuitka构建本机应用程序的示例:

nuitka3 --follow-imports --python-flag=no_site --verbose --standalone --show-progress --show-modules --output-dir=my_build_dir myscript.py

这将使用my_build_dir文件夹中的库创建mac可执行文件。您需要自己将它们包装在MacOS应用程序包中,例如使用PlatypusAutomator

我找到了这个问题的核心答案。因为我想把赏金颁给我以外的人(我是OP),请,任何人,拿着这个内核,把它细化成你自己更完整的答案。

我可以将应用程序菜单设置为“MyApp”,如下所示:

ln -s /System/Library/Frameworks/Python.framework/Versions/2.6/Resources/Python.app/Contents/MacOS/Python MyApp

./MyApp MyApp.py

要使其工作,需要两个要素:

  1. 符号链接必须命名为“MyApp”(或您想在应用程序菜单中显示的任何内容)
  2. 符号链接必须指向系统Python应用程序包中的Python可执行文件。例如,如果链接到/usr/bin/python,它就不起作用。

必须有一个聪明的方法来创建一个应用程序包或shell脚本,以健壮的方式利用这个机制。。。

相关问题 更多 >