0

我正在使用 applescript 模块在 python 中编写一个 applescript 函数,但在概括以下函数时遇到了麻烦:

scpt = applescript.AppleScript('''
    on code()
        tell application "System Events"
            key code 123 using command down
        end tell
    end code
''')

以便 keycode 和 keydown 变量可以作为输入参数,如下所示:

scpt = applescript.AppleScript('''
    on code(kc, extras)
        tell application "System Events"
            key code kc extras
        end tell
    end code
''')

但我收到以下运行时错误:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "example.py", line 28, in <module>
   ''')
File "build/bdist.macosx-10.7-intel/egg/applescript/__init__.py", line 49, in __init__

applescript.ScriptError: Expected end of line but found application constant or consideration. (-2741) range=410-414

所以我认为我的语法有问题。

我正在使用 Mac 0SX 10.7.5,python 2.7.1。

编辑

此代码位于名为 example.py 的 python 模块中,这里的代码与模块中的代码完全相同:

import applescript

scpt = applescript.AppleScript('''
    on code(kc, extras)
        tell application "System Events"
            key code kc extras
        end tell
    end code
''')

我从命令行调用它,如下所示:

$ python
Python 2.7.1 (r271:86832, Aug  5 2011, 03:30:24)
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import example as e
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "example.py", line 9, in <module>
    ''')
  File "build/bdist.macosx-10.7-intel/egg/applescript/__init__.py", line 49, in __init__

applescript.ScriptError: Expected end of line but found identifier. (-2741) range=90-96

其中第 9 行是我的模块的最后一行——''')。

4

2 回答 2

1

我的猜测是你传递了错误的变量类。我会做这样的事情。我会告诉自己,我将始终传递字符串,然后让代码将变量转换为正确的类。我会这样做是因为很难将诸如命令/选项/控制类型键之类的正确类传递给系统事件。他们有自己的类,只有系统事件才能理解。我不知道你会如何通过它们。

因此,使用所有字符串,一个简单的 if 语句就可以处理其余部分。另请注意,我也添加了一个应用程序变量。当您发出击键时,击键会发送到最前面的应用程序,因此最好在执行击键之前通过“激活”它来确保要定位的应用程序位于最前面。

这是基本的applescript代码......

on code(appName, theNum, theModifier)
    tell application appName to activate
    delay 0.2

    set theNum to theNum as number
    tell application "System Events"
        if theModifier is "command" then
            key code theNum using command down
        else if theModifier is "option" then
            key code theNum using option down
        else if theModifier is "control" then
            key code theNum using control down
        else if theModifier is "shift" then
            key code theNum using shift down
        end if
    end tell
end code

然后你可以用这样的东西运行它(注意我正在传递所有字符串)......

code("Safari", "123", "command")
于 2013-10-14T16:56:33.960 回答
0

py-applescript 模块提供用于定义(类型)和AEType(枚举器)对象的类。没有术语支持,因此您需要从 AppleScript Editor 导出应用程序的 SDEF 并查找相应的四字符代码(例如-> 、-> )。例子:AEEnumclassconstantdocumentb"docu"Unicode textb"utxt"

#!/usr/bin/python2.7

import applescript

# AppleScript 'constants' (four-char codes taken from 'System Events.sdef')
command_down = applescript.AEEnum("Kcmd")
control_down = applescript.AEEnum("Kctl")
option_down = applescript.AEEnum("Kopt")
shift_down = applescript.AEEnum("Ksft")


scpt = applescript.AppleScript('''
    on code(kc, extras)
        tell application "System Events"
            key code kc using extras
        end tell
    end code
''')

scpt.call("code", 45, [command_down, option_down]) # Cmd-Opt-N
于 2013-10-21T19:39:58.410 回答