2012-02-15 70 views
3

编辑从JavaScript调用

因为我张贴问题的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 = '[email protected]:'): 
    return NO 

点击HTML按钮,给了我这个错误:

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

END编辑

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

几天前,我已经偶然发现这是更复杂的(http://stackoverflow.com/questions/2288582/embedded-webkit-script-callbacks-how)。不用说,我无法实现它的工作。

所以,如果任何人有一个简单的例子(pyobjc & js),我真的很感激,如果你会告诉我。

回答

0

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

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

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

1

我可以提出建议吗? Javascript和Python在说HTTP方面都做了很棒的工作。也许在机器上设置一个Python HTTP服务器,并且当Javascript获得触发器时,它可以只对本地服务器执行XHttpRequest?

或者..如果您在PySide/PyQt中使用QtWebKit,可以获得Javascript和Python聊天(非常粗略)。 PyObjC这些天支持得很差,在很多情况下只能“勉强工作”,而在大多数情况下则不能。 PyObjC的人没有冒犯,但让我们公平 - 这个项目不像以前那么频繁。

0

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

def isSelectorExcludedFromWebScript_(self, aSel): 
    if aSel is objc.selector(self.showMessage, signature = '[email protected]:'): 
     return NO 

在 'ASEL' 参数是在Objective-C,这是一个选择器名称的SEL。这样的事情应该更好地工作:

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:”并且具有单个参数(如方法签名所预期的那样)