从Javascript调用PyObjc函数

时间:2012-02-15 18:17:18

标签: javascript objective-c webview pyobjc

修改

自从我发布问题后,我发现了另一个有效的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

结束编辑

我试图从javascript调用PyObjc函数,但我无法让它工作。我找到了一个用Objc编写的工作示例(https://github.com/ryanb/cocoa-web-app-example),但没有运气翻译它。

几天前,我偶然发现了这个问题(http://stackoverflow.com/questions/2288582/embedded-webkit-script-callbacks-how)。毋庸置疑,我无法让它发挥作用。

所以,如果有人有一个简单的例子(pyobjc&amp; js),如果你给我看,我真的很感激。

3 个答案:

答案 0 :(得分:1)

我可以提出建议吗? Javascript和Python在讲HTTP时都做得非常好。也许在机器上设置一个Python HTTP服务器,当Javascript获得触发器时,它可以只对本地服务器执行XHttpRequest?

或者..如果你将QtWebKit与PySide / PyQt一起使用,可以让Javascript和Python聊天(非常粗略)。 PyObjC目前支持得很差,在很多情况下只能设法“勉强工作”,而在大多数情况下则没有。 PyObjC人员没有冒犯,但让我们公平 - 项目不像过去那样频繁更新。

答案 1 :(得分:0)

如果你可以从JavaScript调用Objective-C,那么调用PyObjC创作的Objective-C类或实例应该“正常工作”。

但是,你不能通过PyObjC从JavaScript直接调用Python。

你需要展示一些你尝试过的东西。

答案 2 :(得分:0)

isSelectorExcludedFromWebScript_的第二个实现是错误的:

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

&#39; aSel&#39; argument是Objective-C中的SEL,它是一个选择器名称。这样的事情会更好:

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

    return True

作为一个通用提示:当某些Cocoa类记录它在Python异常中忽略时,或者当您预期某个地方可能存在某个被吞下的Python异常时(确实会发生),您可以要求PyObjC打印有关异常的信息它转换为Objective-C:

import objc
objc.setVerbose(True)

最后:&#34; showMessage&#34;方法应命名为&#34; showMessage _&#34;,下划线确保Cocoa方法将被命名为&#34; showMessage:&#34;并且有一个参数(如方法签名所预期的)