如何以编程方式打开“网络”对话框中的“代理”选项卡?系统偏好设置 > 网络 > 高级 > 代理
对于使用 Chrome 的用户,如果您转到 Menu > Settings > Show Advanced Settings > Change proxy settings... ,则会出现“网络”框,并且它已经在“代理”选项卡上。
我想用python来实现这一点。
做到这一点的方法是通过 Apple Events。如果您打开 AppleScript Editor,您可以在 System Preferences 上打开 Dictionary 并查看命令:
tell application "System Preferences"
reveal pane "com.apple.preference.network"
end tell
那么,你如何从 Python 中做到这一点?有三个选项:
Appscript 好很多,但它实际上是一个废弃的项目,而且 ScriptingBridge 附带 Apple 的 Python 版本。所以,我将首先展示:
import ScriptingBridge
sp = ScriptingBridge.SBApplication.applicationWithBundleIdentifier_('com.apple.SystemPreferences')
panes = sp.panes()
pane = panes.objectWithName_('com.apple.preference.network')
anchors = pane.anchors()
dummy_anchor = anchors.objectAtIndex_(0)
dummy_anchor.reveal()
您可能会注意到 ScriptingBridge 版本比 AppleScript 更加冗长和烦人。这有几个原因。
ScriptingBridge 并不是真正的 AppleEvent-Python 桥,它是封装在 PyObjC 中的 AppleEvent-ObjC 桥,因此您必须使用可怕的ObjectiveCSyntax_withUnderscores_forEachParameterNamed_。
它本质上是非常冗长的。
按名称查找应用程序的“过时”方法未在 ScriptingBridge 中公开,因此您必须找到应用程序的捆绑 ID(或 file:// URL)并打开它。
最重要的是,ScriptingBridge 不公开实际的对象模型;它强制它进入 CocoaScripting OO 风格的模型并公开它。因此,虽然 System Preferences 知道如何做reveal
任何事情,但 ScriptingBridge 包装器只知道如何调用对象reveal
上的方法anchor
。
虽然最后两个是最麻烦的,但前两个也可能很烦人。例如,即使使用捆绑 ID 并遵循 CocoaScripting 模型,AppleScript 中的等效项如下所示:
tell application "com.apple.SystemPreferences"
reveal first anchor of pane "com.apple.preference.network"
end tell
……在 Python 中appscript
:
import appscript
sp = appscript.app('com.apple.SystemPreferences')
sp.panes['com.apple.preference.network'].anchors[1].reveal()
同时,一般来说,我不建议任何 Python 程序员将他们的任何逻辑移到 AppleScript 中,或者尝试编写跨越边界的逻辑(因为我订阅了日内瓦反对酷刑公约)。因此,我会立即从 ScriptingBridge 或 appscript 开始,以防我们可能需要这么多的if
语句。但在这种情况下,事实证明,我们不需要那个。因此,使用 AppleScript 解决方案可能是最好的答案。这是带有 py-applescript 的代码,或者只有 Apple 开箱即用的代码:
import applescript
scpt = 'tell app "System Preferences" to reveal pane "com.apple.preference.network"'
applescript.AppleScript(scpt).run()
import Foundation
scpt = 'tell app "System Preferences" to reveal pane "com.apple.preference.network"'
ascpt = Foundation.NSAppleScript.alloc()
ascpt.initWithSource_(scpt)
ascpt.executeAndReturnError_(None)