如何以编程方式打开“网络”对话框中的“代理”标签? 系统偏好设置>网络>高级>代理
对于使用Chrome的用户,如果您转到菜单>设置>显示高级设置>更改代理设置...,“网络”框显示,并且已经在“代理”选项卡上。
我想用python实现这个目的。
答案 0 :(得分:3)
这样做的方法是通过Apple Events。如果打开AppleScript编辑器,则可以在“系统偏好设置”上打开“词典”并查看命令:
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桥,所以你必须使用horribleObjectiveCSyntax_withUnderscores_forEachParameterNamed _。
这本身就是非常冗长的。
在ScriptingBridge中没有公开按名称查找应用程序的“过时”方法,因此您必须找到应用程序的软件包ID(或文件:// URL)并打开它。
最重要的是,ScriptingBridge不公开实际的对象模型;它强制它进入CocoaScripting OO风格的模型并公开它。因此,虽然系统偏好设置知道如何reveal
任何内容,但ScriptingBridge包装器只知道如何在reveal
对象上调用anchor
方法。
虽然最后两个是最麻烦的,但前两个也很烦人。例如,即使使用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)