包装画布标记的最简单方法&x2B;Python程序中的javascript?

包装画布标记的最简单方法&x2B;Python程序中的javascript?,javascript,python,html,cocos2d-iphone,cross-platform,Javascript,Python,Html,Cocos2d Iphone,Cross Platform,我正在使用cocos2djavascript创建一个跨平台的游戏,并希望创建一个看起来是本地的PC版本。我知道,只要稍加修改,我就可以让我的cocos2d javascript程序在浏览器中运行,但我希望该程序在自己的(非浏览器)窗口中运行,能够创建多个窗口,能够在不通过浏览器安全控制的情况下以本机方式访问文件系统等,我想让我的Python程序提供一个javascript引擎和一个画布标记,cocos2d-html5可以在上面运行。一个非常精简的浏览器,如果你愿意的话 我的问题是,以跨平台(即P

我正在使用cocos2djavascript创建一个跨平台的游戏,并希望创建一个看起来是本地的PC版本。我知道,只要稍加修改,我就可以让我的cocos2d javascript程序在浏览器中运行,但我希望该程序在自己的(非浏览器)窗口中运行,能够创建多个窗口,能够在不通过浏览器安全控制的情况下以本机方式访问文件系统等,我想让我的Python程序提供一个javascript引擎和一个画布标记,cocos2d-html5可以在上面运行。一个非常精简的浏览器,如果你愿意的话


我的问题是,以跨平台(即PC、Mac和Linux)的方式实现这一点最简单的方法是什么?我可以将python spidermonkey或python-v8用于javascript引擎,但我不确定如何最好地提供可以在其上绘制的画布标记

如果你在寻找“我能写的代码最少”这一最简单的方法,那么嵌入完整的浏览器实际上比从头开始编写精简的浏览器更容易

因此,最简单的解决方案可能是使用

在封面下,这远不是你能得到的简单(或“精简”):你正在使用一个功能强大、复杂的跨平台GUI库,它有一个深度集成的WebKit包装器,它为URL甚至web页面等对象公开自定义对象,一直到对象模型

但是从你的代码来看,只需将一个web视图粘贴到一个窗口中,用
canvas
标记和你的JS应用程序创建一个HTML页面,然后将所有内容连接起来

一个不利因素是学习曲线。Qt很大,在做任何有用的事情之前,你必须至少学习基本概念。幸运的是,如果您已经完成了ObjC编程,那么信号和插槽、QObject模型等应该都很熟悉……但并不完全相同

另一个不利因素是分销。你要么需要Qt和PySide(或PyQt)以及Python(这是一个很高的要求,除非你只关心linux用户),要么学习打包的细节
PySide
以及
cx\u-freeze
/
py2exe
/
py2app
/等等


从外部与画布或JS代码交谈是非常容易的。
QWebView
包含一个
QWebPage
,其中包含一个
QWebFrame
,它是由
QWebElement
包装器组成的完整DOM:

frame = view.page().mainFrame()
canvas = frame.findFirstElement("#cocos-canvas')
然后,您可以在DOM本身或任何元素上调用
evaluateJavaScript
,方法与您从ObjC的WebKit包装器中熟悉的方法相同

换一种方式,虽然您可以使用注入JS或评估调用代码的函数定义的相同技巧,但也可以将
QAction
s附加到网页上,然后您可以使用与正常操作(菜单项、按钮单击等)相同的方式连接到该网页上。当然,JS可以像用户一样轻松地触发它们


或者您可以通过调用将任何
QObject
子类直接公开给JS,这允许JS代码调用对象上的方法,包括附加回调的方法。有关详细信息,请参阅。

如果您是从头开始,那么很明显,仅模拟HTML画布要比模拟整个HTML DOM简单得多。但是,如果您正在寻找实现这一点的现有代码,我不知道有任何东西可以实现前者,后者有多种可能性。显而易见的是WebKit/Chromium,有几种不同的包装。这就是你想要的吗?嗯,是的,我在寻找最简单的“最少的代码供我写”。我还需要能够将JS代码挂钩到python代码中(例如,在相同的位置,这些挂钩将被挂到原生Objective-C代码中)+1,以了解使用哪个库的技巧。但是,我是否能够在webview的javascript引擎和我的python代码之间通过这个解决方案进行通信?@Claudiu:是的。你可以做同样的注入和评估JS,这听起来像是你从iOS开始就习惯了…也许吧?但更简单的是,您可以将
QAction
s直接分配给web DOM元素,JS可以像用户使用鼠标一样轻松地触发这些元素。请参见链接页面上的示例。(不幸的是,它们是C++而不是Python,但是如果你写Objc、JS和Python,我猜你至少可以读C++)。如果你需要一个更详细的例子,我可以搜索一个。HMM确实很有前途。我会在网站上做一些调查,但这可能是一个好办法。要么是这样,要么在pygame中重新实现图形引擎,或者在PC版本中重新实现图形引擎,但这似乎更容易。re:您的最新编辑,无论哪种方式,我都会使用python,所以唯一的问题是Qt&PyQt与pygame相比会有多大。实际上,我以前在一个项目中使用过一点Qt,这应该会使再次使用它变得更容易一些@克劳迪乌:包起来肯定更大,更痛苦。PySide使后者稍微好一点(同时也改善了一些许可问题),但不是前者。看看我在Mac上的一个PyQt应用和一个pygame应用,前者在24MB的总容量中有15.9MB的PyQt+Qt,而后者的总容量为3.4MB……不过,我还没有找到任何比Qt更适合webnative交互的应用,除了编写本地web/WebSockets服务的本机代码之外(实际上,这是另一种有用的可能性)。