在OSX中,将应用程序名称更改为"python
我正在使用Orange这个软件,但在我的OSX系统(10.6.5)上,菜单栏的名字显示的是'Python',而不是'Orange'。这个软件是用Python和Qt开发的。我需要做什么改变呢?
为了更清楚:
- 这是一个Qt应用程序,不是命令行工具,也不是在终端中运行的。
我的info.plist文件内容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDisplayName</key>
<string>YOORANGE</string>
<key>CFBundleExecutable</key>
<string>Orange</string>
<key>CFBundleIconFile</key>
<string>orange.icns</string>
<key>CFBundleIdentifier</key>
<string>si.ailab.Orange</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>Orange</string>
<key>CFBundleGetInfoString</key>
<string>Orange, component-based data mining software</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleSignature</key>
<string>Orng</string>
<key>CFBundleShortVersionString</key>
<string>1.0.0</string>
<key>CFBundleVersion</key>
<string>1.0.0</string>
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>ows</string>
</array>
<key>CFBundleTypeName</key>
<string>Orange Canvas Schema</string>
<key>CFBundleTypeOSTypes</key>
<array>
<string>OWSf</string>
</array>
<key>CFBundleTypeIconFile</key>
<string>schema.icns</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
<key>LSIsAppleDefaultForType</key>
<true/>
</dict>
</array>
</dict>
</plist>
这是Orange的启动脚本,我做了一些修改,尝试使用符号链接。显然,有些东西需要修正 :)
#!/bin/bash
BUNDLE_DIR=`dirname $0`/../
BUNDLE_DIR=`perl -MCwd=realpath -e 'print realpath($ARGV[0])' $BUNDLE_DIR`/
FRAMEWORKS_DIR="$BUNDLE_DIR"Frameworks/
CANVAS_FILE="$FRAMEWORKS_DIR"Python.framework/Versions/2.6/lib/python2.6/site-packages/orange/OrangeCanvas/orngCanvas. pyw
cp "$FRAMEWORKS_DIR"Python.framework/Resources/Python.app/Contents/MacOS/{Python-32,AWESOME}
PYTHONEXECUTABLE="$FRAMEWORKS_DIR"Python.framework/Resources/Python.app/Contents/MacOS/AWESOME
PYTHONHOME="$FRAMEWORKS_DIR"Python.framework/Versions/2.6/
#DYLD_FRAMEWORK_PATH="$FRAMEWORKS_DIR"${DYLD_FRAMEWORK_PATH:+:$DYLD_FRAMEWORK_PATH}
DYLD_FRAMEWORK_PATH="$FRAMEWORKS_DIR":"$BUNDLE_DIR"Resources/Qt4/lib${DYLD_FRAMEWORK_PATH:+:$DYLD_FRAMEWORK_PATH}
export PYTHONEXECUTABLE
export PYTHONHOME
export DYLD_FRAMEWORK_PATH
export DYLD_LIBRARY_PATH="$BUNDLE_DIR"Resources/openbabel/lib/:"$BUNDLE_DIR"Resources/openbabel/lib/openbabel/2.2.3/:$ DYLD_LIBRARY_PATH
# LaunchServices passes the Carbon process identifier to the application with -psn paramter - we do not want it
if [[ "$1" == -psn* ]] ; then
shift
fi
echo "$0"
echo "$PYTHONEXECUTABLE"
echo "$@"
exec -a "$0" "$PYTHONEXECUTABLE" "$CANVAS_FILE" "$@"
4 个回答
1
简单来说,这个问题不太简单,因为你在运行Python解释器,而它是一个独立的程序,有自己默认的标题。
详细说说——如果你设置了一个叫PYTHONSTARTUP的环境变量,Python解释器在启动时会执行一个shell脚本。你可以在这个脚本里设置窗口的标题。
- 首先,设置一个环境变量PYTHONSTARTUP,里面放你想在启动时执行的shell脚本的名字(可以参考这个链接:http://docs.python.org/library/idle.html#startup)
- 然后,在这个shell脚本里,运行settitle [标题]来设置标题。
如果你想要每次启动时标题都不一样,那就需要在启动之前做一些额外的环境变量设置。
7
我想提出另一种解决方案。这个方法使用Cocoa来设置应用程序的名称,不需要去调整符号链接。你可以在主模块中尽早运行这个代码,最好是在使用PyQt之前。
if sys.platform.startswith('darwin'):
# Set app name, if PyObjC is installed
# Python 2 has PyObjC preinstalled
# Python 3: pip3 install pyobjc-framework-Cocoa
try:
from Foundation import NSBundle
bundle = NSBundle.mainBundle()
if bundle:
app_name = os.path.splitext(os.path.basename(sys.argv[0]))[0]
app_info = bundle.localizedInfoDictionary() or bundle.infoDictionary()
if app_info:
app_info['CFBundleName'] = app_name
except ImportError:
pass
1
结果发现,在这个路径下有一个更深层次的 Info.plist 文件:Contents/Frameworks/Python.framework/Versions/2.6/Resources/Python.app/Contents/Info.plist
,这个文件被调用了。