我设计了一个笔记本,让用户可以改变的变量分组到笔记本的不同单元格中。我想使用不同的背景颜色突出显示这些单元格,以便用户知道在哪里调节。
我该如何实现这个功能?
NB: 这个相关问题 是关于静态代码高亮(用于手册),而且被接受的答案建议基本上把所有内容放在标记注释中。在我的情况下,我希望突出显示的代码在一个可运行的单元格中。
我设计了一个笔记本,让用户可以改变的变量分组到笔记本的不同单元格中。我想使用不同的背景颜色突出显示这些单元格,以便用户知道在哪里调节。
我该如何实现这个功能?
NB: 这个相关问题 是关于静态代码高亮(用于手册),而且被接受的答案建议基本上把所有内容放在标记注释中。在我的情况下,我希望突出显示的代码在一个可运行的单元格中。
这里是(假设您使用Python核心):
from IPython.display import HTML, display
def set_background(color):
script = (
"var cell = this.closest('.jp-CodeCell');"
"var editor = cell.querySelector('.jp-Editor');"
"editor.style.background='{}';"
"this.parentNode.removeChild(this)"
).format(color)
display(HTML('<img src onerror="{}" style="display:none">'.format(script)))
然后按照以下方式使用:
set_background('honeydew')
这个解决方案有点巧妙,但我很希望看到一个更加优雅的解决方案。 演示:
在 Firefox 60 和 Chrome 67 中使用 JupyterLab 0.32.1 进行测试。
如果想要将其作为单元格魔法,你可以简单地执行以下操作:
from IPython.core.magic import register_cell_magic
@register_cell_magic
def background(color, cell):
set_background(color)
return eval(cell)
然后像这样使用它:
%%background honeydew
my_important_param = 42
%%background
不适用于标记单元格。 - yoonghm script = (
"var cell = this.closest('.code_cell');"
"var editor = cell.querySelector('.input_area');"
"editor.style.background='{}';"
"this.parentNode.removeChild(this)"
).format(color)
display(HTML('
'.format(script)))```
注意:翻译后的代码与原始代码的意思相同,但可能不会保留精细的技术细节。
- psychemedianbconvert
转换的单元格的颜色,请在您的文件夹中创建一个模板mytemplate.tpl
并添加以下内容:
{% extends 'full.tpl'%}
{% block any_cell %}
{% if 'highlight' in cell['metadata'].get('tags', []) %}
<div style="background:lightpink">
{{ super() }}
</div>
{% else %}
{{ super() }}
{% endif %}
{% endblock any_cell %}
... 然后将标签“highlight”添加到您的单元格中。在 Jupyter lab 中,您可以在选定的单元格左侧执行此操作:
现在,使用模板将笔记本转换为 nbconvert:
jupyter nbconvert --to html 'mynb.ipynb' --template=mytemplate.tpl
对于 krassowski 的代码,我有一个小的补充(试图将其作为评论添加,但无法使格式正常显示)。
from IPython.core.magic import register_cell_magic
from IPython.display import HTML, display
@register_cell_magic
def bgc(color, cell=None):
script = (
"var cell = this.closest('.jp-CodeCell');"
"var editor = cell.querySelector('.jp-Editor');"
"editor.style.background='{}';"
"this.parentNode.removeChild(this)"
).format(color)
display(HTML('<img src onerror="{}">'.format(script)))
bgc('yellow')
bla = 'bla'*3
或者
%%bgc yellow
bla = 'bla'*3
以下是我在 jupyter-notebook
(v6.3.0) 和 jupyter-nbconvert --to=html
(v6.0.7) 中使用的有效方法。
它与 @krassowski 和 @Gabe 的答案有两个不同之处:
交互式笔记本使用类名 .cell
和 .input_area
,但 nbconvert HTML 使用 .jp-CodeCell
、.jp-Editor
和 .highlight
。这段代码可以处理所有这些情况。
我更喜欢 "line magic" 而不是 "cell magic",因为 "line magic" 不会改变单元格其余部分的计算结果。
from IPython.core.magic import register_line_magic
from IPython.display import HTML, display
import json
@register_line_magic
def bg(color, cell=None):
script = (
"var n = [this.closest('.cell,.jp-CodeCell')];"
"n = n.concat([].slice.call(n[0].querySelectorAll('.input_area,.highlight,.jp-Editor')));"
f"n.forEach(e=>e.style.background='{color}');"
"this.parentNode.removeChild(this)"
)
display(HTML(f'<img src onerror="{script}" style="display:none">'))
%bg yellow
%interac
)。 - P-Gn