1

我正在使用 Jupyter HUB 从存储在服务器中的 jupyter 笔记本中渲染 Html 页面。

使用时,我想创建一个按钮,将特定变量(文本)的内容复制到剪贴板。

重现这种情况的最简单示例如下。我尝试使用我在这里得到的代码通过 Ipython 注入 JS:(将 JavaScript 变量的输出复制到剪贴板)一个按钮应该触发代码并将文本放入剪贴板。但事实并非如此。

import ipywidgets as widgets
from IPython.display import display, HTML, Javascript
mybtn = widgets.Button(description='copy to clipboard',button_style='success')
        
def mybtn_event_handler(change):
    display(Javascript('''var cb = document.getElementById("cb");
  cb.value = 'asdfasdfasdfasdfasdfasdf';
  cb.style.display='block';
  cb.select();
  document.execCommand('copy');
  cb.style.display='none';''')) 

mybtn.on_click(mybtn_event_handler)

display(mybtn)

这在 jupyter 集线器中不起作用。我猜是因为实际上您没有在本地机器上运行代码。

知道如何处理这种情况吗?

实际上,在其他情况下也会遇到此问题,在这些情况下,您可以在使用 Ipython 在本地渲染笔记本时与本地浏览器进行交互。例如,使用 webbrowser 模块打开一个新选项卡很容易,但是当笔记本在 jupyter HUB 中运行时它就不起作用了。

任何的想法?

注意:代码不会产生错误,在日志中只是出现:<IPython.core.display.Javascript object>

注意2:实际上在本地运行此代码不起作用,它会产生:添加输出的Javascript错误!TypeError:无法设置 null 的属性“值”有关详细信息,请参阅您的浏览器 Javascript 控制台。

4

1 回答 1

1

根据文档 - 您应该使用widgets.Output(). 因此,为了通过单击按钮运行一些 Javascript,您应该执行以下操作:

import ipywidgets as widgets
from IPython.display import display, HTML, Javascript

mybtn = widgets.Button(description='copy to clipboard',button_style='success')
output = widgets.Output()

display(mybtn, output)
        
def mybtn_event_handler(b):
    with output:
        display(Javascript('''console.log("Success");''')) 

mybtn.on_click(mybtn_event_handler)
于 2020-10-21T09:20:00.437 回答