Как использовать несколько переменных в одной команде AppleScript?

Я пишу функцию applecript на python с использованием модуля applecript, и у меня возникают проблемы с обобщением следующей функции:

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

так что код клавиши и переменные 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.

РЕДАКТИРОВАТЬ

Этот код находится в модуле python с именем example.py, здесь снова приведен код точно такой же, как и в модуле:

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 - последняя строка моего модуля - ''').

2 ответа

Решение

Я предполагаю, что вы передаете неправильный класс переменной. Я бы сделал что-то подобное. Я бы сказал себе, что я всегда буду передавать строки, а затем позволю коду преобразовать переменную в соответствующий класс. Я бы сделал это, потому что трудно передать правильный класс для таких вещей, как ключи типа команда / опция / управление, в системные события. У них есть свой собственный класс, который понимают только системные события. Я не знаю, как вы могли бы передать их в противном случае.

Таким образом, используя все строки, простой оператор if может обработать все остальное. Также обратите внимание, что я добавил переменную приложения. Когда вы нажимаете клавиши, нажатия клавиш передаются на переднее приложение, поэтому рекомендуется убедиться, что приложение, на которое вы хотите установить таргетинг, находится впереди, "активировав" его перед выполнением нажатий клавиш.

Вот основной яблочный код...

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")

Модуль py-applecript предоставляет AEType а также AEEnum классы для определения class (тип) и constant (перечислитель) объектов. Терминология не поддерживается, поэтому вам нужно будет экспортировать SDEF приложения из AppleScript Editor и найти соответствующие четырехзначные коды (например, document -> b"docu", Unicode text -> b"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
Другие вопросы по тегам