Вызов функции PyObjc из Javascript - PullRequest
3 голосов
/ 15 февраля 2012

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

С тех пор, как я разместил вопрос, я нашел другой рабочий пример 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

END EDIT

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

Пару дней назад я наткнулся на это(/2205770/vstroennyi-webkit-skripty-obratnyh-vyzovov-kak), что более сложно. Само собой разумеется, я не мог заставить это работать.

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

Ответы [ 3 ]

1 голос
/ 15 февраля 2012

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

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

0 голосов
/ 27 февраля 2013

Вторая реализация для 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

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

import objc
objc.setVerbose(True)

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

0 голосов
/ 15 февраля 2012

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

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

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

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