编辑: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键盘上按下音符时,我得到:

javascript - 从JavaScript调用Brython函数-LMLPHP

我不知道如何处理此错误,我也不知道该方法是否正确。

最佳答案

已经一年了,所以我想您已经解决了很久,但是从原理上讲您的方法是正确的,我也一样,当您使用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内部原理的人来说,这可能并非不可能。

09-18 22:21