2013-10-22 70 views
1

如何以編程方式打開「網絡」對話框中的「代理」選項卡? 系統偏好設置>網絡>高級>代理osx以編程方式打開網絡首選項中的「代理」選項卡

對於那些使用Chrome瀏覽器的用戶,如果進入菜單>設置>顯示高級設置>更改代理設置...,網絡框出現, '代理'選項卡。

我想用python來實現這個。

回答

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(和...)橋接器。

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橋,它是一個的AppleEvent-ObjC橋PyObjC包裹起來,所以你必須使用horribleObjectiveCSyntax_withUnderscores_forEachParameterNamed_。

  2. 它本質上是非常詳細的。

  3. 按名稱查看應用程序的「過時」方法未在ScriptingBridge中公開,因此您必須找到應用程序的包ID(或file:// URL)並將其打開。

  4. 最重要的是,ScriptingBridge不公開實際的對象模型;它強制它成爲一個CocoaScripting OO風格的模型並公開這一點。因此,雖然系統偏好設置知道如何reveal什麼,ScriptingBridge包裝只知道如何調用anchor對象上的reveal方法。

雖然最後兩個是最麻煩的,前兩個也可能很煩人。例如,即使使用的包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,或者什麼也沒有,但蘋果公司爲您提供了開箱即用的代碼:

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) 
+0

使用ScriptingBridge,我該如何到達Network> Advanced> Proxies? – mingxiao

+1

@mingxiao:您需要使用錨點的名稱,而不是僅指定窗格中的第一個錨點。我將解釋如何弄清楚:在交互式Python解釋器中(或者在AppleScript編輯器中,如果AS沒有讓你的腦袋陷入麻煩),用''''打印出所有錨點的名字, [anchor.name()用於在pane.anchors()]中定位。找到你想要的。然後,您將使用'anchors.objectWithName _(「您找到的名稱」)''而不是'anchors.objectWithID_(0)'。 – abarnert

+1

@abarnet:另一個選擇是使用py-appscript從Python調用AppleScript處理程序(https://pypi.python.org/pypi/py-applescript)。它僅使用Apple支持的Cocoa API,因此希望能夠比appscript存活更長時間,而不像osascript只能理解字符串,py-applescript可以在最常見的Python和AppleScript類型(布爾值,數字,字符串,日期,列表,記錄等)。 – foo

0

@abarnet:對不起,是的,應該讀過「PY-AppleScript的」,這是一個PyObjC-基於腳本的NSAppleScript包裝,爲您處理繁瑣的類型轉換和錯誤處理。

相關問題