编辑:Google Group post
我在玩Brython。
我试图弄清楚如何从JavaScript执行Brython代码。
http://www.brython.info/static_doc/en/jsobjects.html
对于我的特定情况,我正在监听MIDI事件(使用https://github.com/cwilso/WebMIDIAPIShim)
我希望执行Brython代码以响应收到的MIDI事件。
目前,我正在尝试:
function myMIDIMessagehandler( event )
{
if( brythonListener != null )
brythonListener( event );
和Brython代码:
<script type="text/python3">
from browser import document as doc, window, html
def foo(event):
print("BRYTHON!" + event);
window.brythonListener = foo
</script>
但是,当我在Midi键盘上按下音符时,我得到:
我不知道如何处理此错误,我也不知道该方法是否正确。
最佳答案
已经一年了,所以我想您已经解决了很久,但是从原理上讲您的方法是正确的,我也一样,当您使用window.js_func = py_func映射它时,它也可以工作。这是我目前使用的代码中的一些相关事件位,它们适用于chrome / firefox:
<!-- Bottom of HTML.. -->
<script type="text/javascript">
var jv_funcs = {
openfile:function(iptElement, fileType){
// some file opening code then a call back to python
open_file(reader.result, fileType);
}
};
</script>
<script type="text/python3" src="src/pythonscript.py"></script>
# separate python script in my case 'pythonscript.py'
def open_file(fileContent, fileType):
# show the file in the dom..
def open_clicked():
window.jv_funcs.openfile(document["idOpen"], "fileType")
window.open_file = open_file
document["btnOpen"].bind("click", open_clicked)
有用的信息是,如果您使用window.console.log(event),您将把事件作为对象返回,可以从开发工具中进行探索。另一方面,打印会将其展平为纯文本。
更大的问题可能是,使用Brython来找出某些类型的错误的原因可能非常棘手(尽管对于Brython而言,这是令人惊奇的,并且效果很好)。
简化此类问题根源的一件事就是源映射。最近,我将一个个人项目从Brython移到了Transcrypt,发现Transcrypt的源 map 支持对隔离错误原因有很大帮助。如此之多,以至于我没有尝试增量执行它,而是大胆地编译了python源,并逐一跟踪错误,直到一切正常为止(python部分大约2700行)。从另一个方向来说,这对我来说是不可能的,但对于了解Brython内部原理的人来说,这可能并非不可能。