как использовать `NSScriptCommandDescription initWithSuiteName: commandName: dictionary:` - PullRequest
0 голосов
/ 13 сентября 2011

Я хочу знать, как использовать NSScriptCommandDescription initWithSuiteName:commandName:dictionary:, особеннокак должен выглядеть словарь.

Было бы неплохо увидеть простой пример команды с одним параметром типа NSString и возвращаемым значением типа NSString.

Я думаю, документацию о том, как должен выглядеть словарь, можно найти здесь , esp в "Таблице B-8, Словарь команд".

Однако я пытаюсь использовать этот примери это не работает (возвращает nil):

cmdDesc = NSScriptCommandDescription.alloc().initWithSuiteName_commandName_dictionary_(
    "Standard Suite",
    "execPython",
    {
        "CommandClass": "NSScriptCommand", # default behavior
        "AppleEventCode": "expy", # 4-char code
        "Type": "text", # return-type
        "ResultAppleEventCode": "NSString", # return-type
        "Arguments": [{
            "Type": "NSString",
            "AppleEventCode": "data"
        }]
    }
)

(Примечание: я действительно хочу точно знать это здесь; я не хочу знать, как зарегистрировать определения сценариев илиделать другие вещи с этим вопросом.)

Ответы [ 3 ]

0 голосов
/ 14 сентября 2011

Секция "Arguments" все еще не работает правильно для меня (у меня странные сбои), но я также могу просто пропустить это и получить аргумент, передаваемый во время выполнения.

Это код:

import objc
NSObject = objc.lookUpClass("NSObject")

sharedScriptSuiteReg = objc.lookUpClass("NSScriptSuiteRegistry").sharedScriptSuiteRegistry()
NSScriptCommandDescription = objc.lookUpClass("NSScriptCommandDescription")
sharedAppleEventMgr = objc.lookUpClass("NSAppleEventManager").sharedAppleEventManager()
NSAppleEventDescriptor = objc.lookUpClass("NSAppleEventDescriptor")

from PyObjCTools.TestSupport import fourcc

def register_scripting():
    cmdDesc = NSScriptCommandDescription.alloc().initWithSuiteName_commandName_dictionary_(
        "Chromium Suite",
        "exec Python",
        {
            "Name": "exec Python",
            "CommandClass": "NSScriptCommand", # default behavior
            "AppleEventCode": "ExPy", # 4-char code
            "AppleEventClassCode": "CrSu",
            "Type": "NSString", # return-type
            "ResultAppleEventCode": "ctxt", # return-type
            "Arguments": {
                #"----": {
                #   "Type": "NSString",
                #   "AppleEventCode": "comm"
                #}
            }
        }
    )
    assert cmdDesc is not None
    sharedScriptSuiteReg.registerCommandDescription_(cmdDesc)

    sharedAppleEventMgr.setEventHandler_andSelector_forEventClass_andEventID_(
        appScriptHandler, appScriptHandler.handleExecPy,
        fourcc("CrSu"), fourcc("ExPy"))

def handleExecPy(self, ev, replyEv):
    print "execPython called,",
    cmd = ev.descriptorForKeyword_(fourcc("comm")).stringValue()
    print "cmd:", repr(cmd)
    res = eval(cmd)
    res = unicode(res)
    replyEv.setDescriptor_forKeyword_(NSAppleEventDescriptor.descriptorWithString_(res), fourcc("----"))
    return True

try:
    class AppScriptHandler(NSObject):
        def handleExecPy(self, ev, replyEv):
            try: return handleExecPy(self, ev, replyEv)
            except: traceback.print_exc()
            return
except:
    AppScriptHandler = objc.lookUpClass("AppScriptHandler")
appScriptHandler = AppScriptHandler.alloc().init()

Это работает вместе с этой простой клиентской демонстрацией:

#!/usr/bin/python

import aem

fullpath = aem.findapp.byname("Google Chrome")
app = aem.Application(fullpath)

def execPy(cmd):
    return app.event("CrSuExPy", {"comm": cmd}).send()

print execPy("app.bundle()")

def simple_shell():
    import sys
    try: import readline
    except: pass # ignore
    while True:
        try:
            s = raw_input("> ")
        except:
            print "breaked debug shell:", sys.exc_info()[0].__name__
            break
        s = s.strip()
        if s: print execPy(s)

simple_shell()

Полный код можно увидеть здесь и в действии здесь .

0 голосов
/ 27 ноября 2015

Я знаю, что это ОЧЕНЬ старые вопросы, но я наткнулся на это, и кажется, что этот вопрос statckoverflow является наиболее распространенным результатом при поиске в Google о том, как использовать NSScriptCommandDescription с аргументами.

Код из принятого ответа является правильным, ЗА ИСКЛЮЧЕНИЕМ того, как создается значение аргументов. Значение аргументов должно быть словарем, который отображает имена аргументов с описаниями аргументов. Используя принятый код ответа в качестве примера, чтобы передать аргументы, наш словарь должен выглядеть следующим образом:

cmdDesc = NSScriptCommandDescription.alloc().initWithSuiteName_commandName_dictionary_(
    "Chromium Suite",
    "exec Python",
    {
        "Name": "exec Python",
        "CommandClass": "NSScriptCommand", # default behavior
        "AppleEventCode": "ExPy", # 4-char code
        "AppleEventClassCode": "CrSu",
        "Type": "NSString", # return-type
        "ResultAppleEventCode": "ctxt", # return-type
        "Arguments": {
            "firstArg": {
               "Type": "NSString",
               "AppleEventCode": "comm"
            }
        }
    }
)

Вышеприведенный словарь работает на ObjectC (я не знаю, работает ли код Python).

0 голосов
/ 13 сентября 2011

Единственное, что я могу увидеть там, что не соответствует документации, это ваше значение для "Type";хотя в документации не приведен пример для "Type" в контексте команды, его значение в примерах документации для других контекстов равно "NSString", а не "text".Итак, попробуйте имя класса Cocoa вместо имени класса AppleScript.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...