以编程方式在网络首选项中打开“代理”选项卡

时间:2013-10-22 17:25:10

标签: python macos

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

对于使用Chrome的用户,如果您转到菜单>设置>显示高级设置>更改代理设置...,“网络”框显示,并且已经在“代理”选项卡上。

我想用python实现这个目的。

1 个答案:

答案 0 :(得分:3)

这样做的方法是通过Apple Events。如果打开AppleScript编辑器,则可以在“系统偏好设置”上打开“词典”并查看命令:

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-to-Python(和......)桥。
  4. 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桥,所以你必须使用horribleObjectiveCSyntax_withUnderscores_forEachParameterNamed _。

    2. 这本身就是非常冗长的。

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

    4. 最重要的是,ScriptingBridge不公开实际的对象模型;它强制它进入CocoaScripting OO风格的模型并公开它。因此,虽然系统偏好设置知道如何reveal任何内容,但ScriptingBridge包装器只知道如何在reveal对象上调用anchor方法。

    5. 虽然最后两个是最麻烦的,但前两个也很烦人。例如,即使使用bundle 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中,或者尝试编写跨越边界的逻辑(因为我订阅了日内瓦禁止酷刑的公约)。因此,在任何我们可能需要if语句的情况下,我会立即开始使用ScriptingBridge或appscript。但在这种情况下,事实证明,我们并不需要这样做。因此,使用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)