【问题标题】:Calling a PyObjc function from Javascript从 Javascript 调用 PyObjc 函数
【发布时间】:2012-02-15 18:17:17
【问题描述】:

编辑

自从我发布问题后,我发现了另一个有效的 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 & js),如果你能告诉我,我会非常感激。

【问题讨论】:

    标签: javascript objective-c webview pyobjc


    【解决方案1】:

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

    或者.. 如果您将 QtWebKit 与 PySide / PyQt 一起使用,则可以进行 Javascript 和 Python 聊天(非常粗略)。如今,PyObjC 的支持非常差,在许多情况下只能“勉强工作”,而在大多数情况下则不然。没有冒犯 PyObjC 的人,但公平地说 - 该项目没有像以前那样频繁更新。

    【讨论】:

      【解决方案2】:

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

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

      你需要展示更多你尝试过的东西。

      【讨论】:

        【解决方案3】:

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

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

        'aSel' 参数是 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)
        

        最后:“showMessage”方法应该命名为“showMessage_”,下划线确保 Cocoa 方法将命名为“showMessage:”并且只有一个参数(如方法签名所期望的那样)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-01-22
          • 1970-01-01
          • 1970-01-01
          • 2011-07-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-03-20
          相关资源
          最近更新 更多