【问题标题】:How to get multiple properties at the same time?如何同时获得多个属性?
【发布时间】:2009-10-13 02:09:27
【问题描述】:

我正在使用Appscript - AppleScript 的 Python 接口 - 在我的一个项目中,该项目基本上从 a Mac application 获取数据。

这是一个示例代码:

    asobj = app('Things').to_dos()[0]
    self.id = asobj.id()
    self.name = asobj.name()
    self.status = asobj.status()

属性(id、名称、状态)的每次调用都会进行进程间调用,因此速度很慢......尤其是当您对数千个对象执行相同操作时。

有没有办法通过 AppleScript 的 Python 接口(appscript)同时获取多个属性?

【问题讨论】:

    标签: python macos sourceforge-appscript py-appscript


    【解决方案1】:

    我不能 100% 确定这将如何在 Python 中表达,但大多数 Applescript 对象都支持“属性”属性,该属性将返回一个字典,其中包含该对象的每个受支持属性的键/值对。我猜调用asobj.properties() 会返回一个适当的数据结构,然后您可以从中检索任何您想要的单个属性。

    【讨论】:

    • 是的,许多可编写脚本的应用程序都这样做,并且使用 Appscript,返回 Python 字典: >>> app("TextEdit.app").properties() {k.class_: k.application, k .version: u'1.6', k.frontmost: False, k.name: u'TextEdit'}
    • 谢谢!以前做dir(asobj) 没有帮助。
    • Appscript 引用对象上的 dir() 不会告诉您有关应用程序中 Applescript 对象的任何信息。除非您调用一个方法(例如,.get() 或隐式通过 ()),这会导致 Appscript 将 Apple 事件发送到应用程序对象并根据返回的信息构造一个 Python 对象,否则不会发生任何事情。
    【解决方案2】:

    如果你有大量元素,这样获取你的属性会更快:

    ref = app('Things').to_dos
    ids = ref.id()
    names = ref.name()
    statuses = ref.status()
    

    然后使用 Python 的 zip() 函数根据需要重新排列它们。 appscript 文档中有一个关于优化技术的章节对此进行了更详细的解释。

    如果您还没有这样做,您还应该从 appscript 网站获取 ASDictionary 和 ASTranslate 工具的副本。 ASTranslate 将帮助您将应用程序命令从 AppleScript 转换为 appscript 语法。 ASDictionary 将以 appscript 样式的格式导出应用程序字典,并启用 appscript 的内置 help() 方法,允许您以交互方式浏览应用程序字典(比 dir() 强大得多)。

    【讨论】:

    • 单独获取属性非常慢。
    • 实际上,上面的方法应该比一次请求每个元素的 'properties' 属性要快得多,因为它总共只发送三个 Apple 事件:一个获取所有 id 属性,一个获取所有名称属性,以及获取所有状态属性。或者你甚至可以请求 app('Things').to_dos.properties(),它只需要一个 Apple 事件。这可能会也可能不会比发送三个事件来获取您想要的属性更快,这取决于 Things 和 appscript 打包和解包所有不需要的属性所需的时间。
    猜你喜欢
    • 1970-01-01
    • 2018-12-23
    • 2014-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-29
    • 1970-01-01
    • 2017-10-08
    相关资源
    最近更新 更多