为什么python无法从python函数中调用Javascript()?

时间:2019-04-20 12:39:12

标签: javascript python jupyter-notebook

当从jupyter笔记本中调用时,我使用了Download CSV from an iPython Notebook中建议的代码来动态构建javascript代码,并使用python中的Javascript()将其传递给浏览器。代码效果很好。如果我将相同的代码嵌入python函数中,并从同一jupyter笔记本中调用python函数,则python中的Javascript()调用将不再起作用。如何使可重用功能正常工作?

我正在Windows 10上运行的Chrome版本73.0.3683.103(正式版本)(64位)上尝试此操作。如果已经回答,抱歉。我已经搜索过SO和Google。

这有效。.

from IPython.display import Javascript
js_download = """
var csv = '%s';

var filename = 'results.csv';
var blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });
if (navigator.msSaveBlob) { // IE 10+
    navigator.msSaveBlob(blob, filename);
} else {
    var link = document.createElement("a");
    if (link.download !== undefined) { // feature detection
        // Browsers that support HTML5 download attribute
        var url = URL.createObjectURL(blob);
        link.setAttribute("href", url);
        link.setAttribute("download", filename);
        link.style.visibility = 'hidden';
        document.body.appendChild(link);
        link.click();
        document.body.removeChild(link);
    }
}
""" % data_in_dataframes.to_csv(index=False).replace('\r','\\r').replace('\n','\\n').replace("'","\'")
Javascript(js_download)

这不起作用,它无法执行Javascript(js_download),但没有给出我在jupyter笔记本或浏览器中的Java控制台中看到的任何错误。好像从未执行过Javascript(js_download)。

from IPython.display import Javascript
def js_download_csv(df_download, s_filename='results.csv'):
    js_download =   """
    var csv = '%s';
    var filename = '%s';
    var blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });
    if (navigator.msSaveBlob) { // IE 10+
        navigator.msSaveBlob(blob, filename);
    } else {
        var link = document.createElement("a");
        if (link.download !== undefined) { // feature detection
            // Browsers that support HTML5 download attribute
            var url = URL.createObjectURL(blob);
            link.setAttribute("href", url);
            link.setAttribute("download", filename);
            link.style.visibility = 'hidden';
            document.body.appendChild(link);
            link.click();
            document.body.removeChild(link);
        }
    }
    """ % (df_download.to_csv(index=False).replace('\r','\\r').replace('\n','\\n').replace("'","\'"), s_filename)
    Javascript(js_download)
    return None
js_download_csv(df_download, s_filename)

很抱歉,如果我没有提出任何明显的建议。我找不到任何有关正在发生的信息的错误或日志。

欢迎提出任何建议。

1 个答案:

答案 0 :(得分:1)

我找到了部分答案,因为虽然我不知道为什么会出现此问题,但已经找到了解决方法。在https://medium.com/@tomgrek/reactive-python-javascript-communication-in-jupyter-notebook-e2a879e25906中,我们在文章中看到以下陷阱:

  
    

一个大难题:某个地方需要返回Javascript作为其输出,否则它不会在笔记本中执行。

  

因此,如果我们将代码更改为以下代码(即返回Javascript调用),那么它将起作用。

from IPython.display import Javascript
def js_download_csv(df_download, s_filename='results.csv'):
    js_download =   """
    var csv = '%s';
    var filename = '%s';
    var blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });
    if (navigator.msSaveBlob) { // IE 10+
        navigator.msSaveBlob(blob, filename);
    } else {
        var link = document.createElement("a");
        if (link.download !== undefined) { // feature detection
            // Browsers that support HTML5 download attribute
            var url = URL.createObjectURL(blob);
            link.setAttribute("href", url);
            link.setAttribute("download", filename);
            link.style.visibility = 'hidden';
            document.body.appendChild(link);
            link.click();
            document.body.removeChild(link);
        }
    }
    """ % (df_download.to_csv(index=False).replace('\r','\\r').replace('\n','\\n').replace("'","\'"), s_filename)
    return Javascript(js_download)
js_download_csv(df_download, s_filename)