Вызов функции PyObjc из Javascript

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

Поскольку я разместил вопрос, я нашел еще один рабочий пример Objc (http://mattgemmell.com/2008/02/24/skinnable-cocoa-ui-with-webkit-and-css + источник: http://mattgemmell.com/files/source/skinnableapp.zip)

Это то, что у меня есть сейчас:

webview_obj_from_jsAppDelegate.py

from Foundation import *
from AppKit import *
import objc

class webview_obj_from_jsAppDelegate(NSObject):
  interface = objc.IBOutlet()
  def applicationDidFinishLaunching_(self, sender):
  NSLog("Application did finish launching.")

  def awakeFromNib(self):
    self.interface.setFrameLoadDelegate_(self)
    path = NSBundle.mainBundle().resourcePath() + '/interface/index.html'
    self.interface.setMainFrameURL_(path)
    self.interface.windowScriptObject().setValue_forKey_(self, 'AppController')

  #this is what I suspect to be the problem
  def isSelectorExcludedFromWebScript_(self, aSel):
    return NO

  def showMessage(self, message):
    NSLog(message)

index.html

  <!DOCTYPE html>
  <html lang="en">
    <head>
      <title>title</title>
      <meta http-equiv="Content-type" content="text/html; charset=utf-8">
      <meta name="description" content="description">
      <meta name="keywords" content="">
    </head>
    <body>
      <input id="message_button" type="button" value="Show Message" onClick="window.AppController.showMessage_('I clicked a button and I liked it');" />
    </body>
  </html>

Теперь, если я добавлю селектор в isSelectorExcludedFromWebScript_ следующим образом:

def isSelectorExcludedFromWebScript_(self, aSel):
  if aSel is objc.selector(self.showMessage, signature = 'v@:'):
    return NO

нажатие кнопки HTML дает мне эту ошибку:

WebKit discarding exception: <OC_PythonException> <type 'exceptions.ValueError'>: isSelectorExcludedFromWebScript:: returned None, expecting a value

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

Я пытаюсь вызвать функцию PyObjc из javascript, но не могу заставить ее работать. Я нашел рабочий пример (https://github.com/ryanb/cocoa-web-app-example), написанный на Objc, но не смог его перевести.

Пару дней назад я наткнулся на это (http://stackoverflow.com/questions/2288582/embedded-webkit-script-callbacks-how), которое сложнее. Излишне говорить, что я не мог заставить его работать.

Так что, если у кого-нибудь есть простой пример (pyobjc & js), я был бы очень признателен, если бы вы мне его показали.


person Stelian    schedule 15.02.2012    source источник


Ответы (3)


Могу я сделать предложение? Javascript и Python отлично справляются с HTTP. Возможно, настроить HTTP-сервер Python на машине, и когда Javascript получит триггер, он сможет просто отправить XHttpRequest на локальный сервер?

В качестве альтернативы. Можно получить чат Javascript и Python (очень грубо), если вы используете QtWebKit с PySide/PyQt. В наши дни PyObjC очень плохо поддерживается, и во многих случаях ему удается «едва работать», а в большинстве случаев нет. Не в обиду ребятам из PyObjC, но давайте будем честными — проект просто не обновляется так часто, как раньше.

person synthesizerpatel    schedule 15.02.2012

Если вы можете вызывать Objective-C из JavaScript, то вызов класса или экземпляра Objective-C, созданного PyObjC, должен «просто работать».

Однако вы не можете напрямую вызывать Python из JavaScript через PyObjC.

Вам нужно будет показать немного больше того, что вы пробовали.

person bbum    schedule 15.02.2012

Вторая реализация для isSelectorExcludedFromWebScript_ неверна:

def isSelectorExcludedFromWebScript_(self, aSel):
   if aSel is objc.selector(self.showMessage, signature = 'v@:'):
      return NO

Аргумент aSel — это SEL в Objective-C, который является именем селектора. Что-то вроде этого должно работать лучше:

def isSelectorExludedFromWebScript_(self, aSel):
    if aSel == b'showMessage':
       return False

    return True

В качестве общей подсказки: когда какой-либо класс Cocoa регистрирует, что он проигнорирован в исключении Python, или когда вы ожидаете, что где-то может быть проглоченное исключение Python (что действительно происходит), вы можете попросить PyObjC распечатать информацию об исключениях, которые он преобразует. к цели-C:

import objc
objc.setVerbose(True)

И наконец: метод «showMessage» должен называться «showMessage_», символ подчеркивания гарантирует, что метод Cocoa будет называться «showMessage:» и иметь один аргумент (как и предполагалось в сигнатуре метода)

person Ronald Oussoren    schedule 26.02.2013