【问题标题】:how to use multiple variables in the same AppleScript command?如何在同一个 AppleScript 命令中使用多个变量?
【发布时间】:2013-10-14 09:16:20
【问题描述】:

我正在使用 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 行是我模块的最后一行 -- ''')。

【问题讨论】:

  • 哪一行是 28,你能告诉我你是怎么调用这个函数的吗?

标签: python variables python-2.7 applescript keycode


【解决方案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")

【讨论】:

    【解决方案2】:

    py-applescript 模块提供AETypeAEEnum 类用于定义class(类型)和constant(枚举数)对象。没有术语支持,因此您需要从 AppleScript 编辑器导出应用程序的 SDEF 并查找相应的四字符代码(例如 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
    

    【讨论】:

      猜你喜欢
      • 2015-09-28
      • 2010-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-05
      • 1970-01-01
      相关资源
      最近更新 更多