修改
自从我发布问题后,我发现了另一个有效的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),如果你给我看,我真的很感激。
答案 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;并且有一个参数(如方法签名所预期的)