从Python中干净地调用Webkit Javascript函数

时间:2012-09-29 04:14:25

标签: javascript python qt webkit pyqt

对于我目前正在处理的应用程序,我决定使用HTML5作为界面,允许我拥有一个现代界面,在更改操作系统时不会改变外观。当然,我选择webkit引擎进行渲染,特别是PyQT绑定。我的问题是,每次我想从python调用javascript函数时,我都必须使用凌乱的evaluateJavaScript函数来完成它。

我可以使用哪些替代方案,允许更直接的方式调用javascript函数?

1 个答案:

答案 0 :(得分:0)

PyQt没有任何使事情变得容易的包装器。

你可以写自己的,如果你想 - 不完美,但更好一点。例如,像这样的东西(只是一个骨架,而不是实际的代码):

class JSObject(object):
    def __init__(self, name):
        self.name = name
    def __getattr__(self, attr):
        class Proxy(object):
            def __init__(self, objname, funcname):
                self.name = '%s.%s' % (objname, funcname)
            def __call__(self, *args):
                argstr = ', '.join(json.dumps(arg) for arg in args)
                retstr = evaluateJavaScript('%s(%s)' % (self.name, argstr)
                # realistically you may want to do more to parse the return
                # value—e.g., look up/create JSONObjects as needed?
                return json.loads(retstr)
        return Proxy(self, attr)

thingIWantToCall = JSObject('thingIWantToCall')
print thingIWantToCall.methodIWantToCallOnIt('foo', [1, 2, 3])

正如您所看到的,它仍然有点笨拙 - 您必须手动创建对象代理,并且无法调用自由函数或声明变量或除对象上的调用方法之外的任何其他内容。其中一些可以实施,但是你可以走多远是有限的。 (当然,你总是可以回到显式字符串。)