对于我目前正在开发的应用程序,我决定使用 HTML5 作为界面,让我拥有一个现代界面,当您更改操作系统时,其外观不会发生变化。我自然选择了 webkit 引擎进行渲染,特别是 PyQT 绑定。我的问题是,每次我想从 python 调用 javascript 函数时,我都必须使用凌乱的 evaluateJavaScript 函数。
我可以使用的任何替代方法允许更直接地调用 javascript 函数吗?
对于我目前正在开发的应用程序,我决定使用 HTML5 作为界面,让我拥有一个现代界面,当您更改操作系统时,其外观不会发生变化。我自然选择了 webkit 引擎进行渲染,特别是 PyQT 绑定。我的问题是,每次我想从 python 调用 javascript 函数时,我都必须使用凌乱的 evaluateJavaScript 函数。
我可以使用的任何替代方法允许更直接地调用 javascript 函数吗?
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])
正如您所看到的,它仍然有点笨拙——您必须手动创建对象代理,并且除了调用对象上的方法之外,没有办法调用自由函数或声明变量或其他任何东西。其中一些可以实施,但你能走多远是有限度的。(当然,您总是可以回退到显式字符串。)