OS X:从Python移动窗口

时间:2013-05-16 22:28:08

标签: python macos pyobjc scripting-bridge

我正试图在OS X上以Python编程方式移动窗口。

我在Stackoverflow上找到了一个AppleScript here的片段来实现这一点,但我想用Python或其他“真正的”脚本语言来做。

这是我的Python脚本,不起作用。我在每个下面写下了打印命令的输出。

#!/usr/bin/python

from Foundation import *
from ScriptingBridge import *

app = SBApplication.applicationWithBundleIdentifier_("com.apple.SystemEvents")

finderProc = app.processes().objectWithName_("Finder")

print finderProc
# <SystemEventsProcess @0x74b641f0: SystemEventsProcess "Finder" of application "System Events" (29683)>

finderWin = finderProc.windows()[0]

print finderWin
# <SystemEventsWindow @0x74b670e0: SystemEventsWindow 0 of SystemEventsProcess "Finder" of application "System Events" (29683)>

print finderWin.name()
# Macintosh HD

finderWin.setBounds_([[20,20],[100,100]])
# no visible result

finderWin.setPosition_([20,20])

最后一个命令(setPosition_)崩溃,出现以下异常。

Traceback (most recent call last):
  File "/Users/mw/Projekte/Python/winlist.py", line 17, in <module>
    finderWin.setPosition_([20,20])
AttributeError: 'SystemEventsWindow' object has no attribute 'setPosition_'

如何使setBounds命令有效?

2 个答案:

答案 0 :(得分:3)

您不必通过系统事件(我怀疑它会起作用)。相反,直接在Finder应用程序上执行此操作:

from ScriptingBridge import *

app = SBApplication.applicationWithBundleIdentifier_("com.apple.Finder")
finderWin = app.windows()[0]
finderWin.setBounds_([[100,100],[100,100]])
finderWin.setPosition_([20,20])

您也不需要基金会导入。

答案 1 :(得分:2)

如果您想从Python与OS X的辅助功能API进行交互,请尝试atomac。 System Events只是围绕各种系统API的AppleScriptable包装器,但是PyObjC和其他Python库已经为您提供了对系统API的广泛访问,而无需处理任何AS / SB废话。

-

p.s您可能需要启用&#39;辅助设备&#39;系统偏好设置中的选项&#39;可访问性窗格,否则大多数辅助功能都无法使用。