1

如何以编程方式打开“网络”对话框中的“代理”选项卡?系统偏好设置 > 网络 > 高级 > 代理

对于使用 Chrome 的用户,如果您转到 Menu > Settings > Show Advanced Settings > Change proxy settings... ,则会出现“网络”框,并且它已经在“代理”选项卡上。

我想用python来实现这一点。

4

1 回答 1

3

做到这一点的方法是通过 Apple Events。如果您打开 AppleScript Editor,您可以在 System Preferences 上打开 Dictionary 并查看命令:

tell application "System Preferences"
    reveal pane "com.apple.preference.network"
end tell

那么,你如何从 Python 中做到这一点?有三个选项:

  1. 创建一些 AppleScript 并通过 PyObjC 或通过py- applescript 之类的包装器运行它。
  2. 使用ScriptingBridge,Apple 的 AppleEvents-to-Python(以及 -Ruby 和 -ObjC)桥。
  3. 使用appscript,一个第三方 AppleEvents 到 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 更加冗长和烦人。这有几个原因。

  1. ScriptingBridge 并不是真正的 AppleEvent-Python 桥,它是封装在 PyObjC 中的 AppleEvent-ObjC 桥,因此您必须使用可怕的ObjectiveCSyntax_withUnderscores_forEachParameterNamed_。

  2. 它本质上是非常冗长的。

  3. 按名称查找应用程序的“过时”方法未在 ScriptingBridge 中公开,因此您必须找到应用程序的捆绑 ID(或 file:// URL)并打开它。

  4. 最重要的是,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)
于 2013-10-22T17:46:26.420 回答