如何更改 jupyter notebook / jupyterlab 中单个单元格的背景颜色?
How to change the background color of a single cell in a jupyter notebook / jupyterlab?
我设计了一个笔记本,以便用户可以更改的变量在整个笔记本中分组到不同的单元格中。我想用不同的背景颜色突出显示那些单元格,以便用户可以清楚地看到旋钮的位置。
我怎样才能做到这一点?
注意: 是关于 static 代码突出显示(对于手册)和接受的答案建议基本上将所有内容都放在标记注释中。就我而言,我希望突出显示的代码位于 可运行单元格 .
中
给你(假设你使用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')
这个解决方案有点老套,我很乐意看到一个更优雅的解决方案。
演示:
使用 JupyterLab 0.32.1 在 Firefox 60 和 Chrome 67 中测试。
编辑让它成为细胞魔法,你可以简单地做:
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
的小补充(试图将其添加为评论但无法使格式正常工作)。
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
如果只需要改变nbconvert
转换的单元格的颜色,
在您的文件夹中创建模板 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 %}
(改编自官方docs)
.. 然后将标签 "highlight" 添加到您的单元格。在 Jupyter 实验室中,您可以在左侧为选定的单元格执行此操作:
现在,使用模板使用 nbconvert 转换笔记本:
jupyter nbconvert --to html 'mynb.ipynb' --template=mytemplate.tpl
生成的 HTML 将如下所示:
我发现这适合向读者突出显示特定单元格。
以下是在 jupyter-notebook
(v6.3.0) 和 jupyter-nbconvert --to=html
(v6.0.7) 中对我有用的内容。
它与@krassowski 和@Gabe 的回答有两点不同:
交互式笔记本使用 class 名称 .cell
和 .input_area
,但 nbconvert HTML 使用 .jp-CodeCell
和 .jp-Editor
和 .highlight
。此代码处理所有这些。
我更喜欢“线魔术”而不是“单元魔术”,因为线魔术不会改变单元格其余部分的计算。
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
我设计了一个笔记本,以便用户可以更改的变量在整个笔记本中分组到不同的单元格中。我想用不同的背景颜色突出显示那些单元格,以便用户可以清楚地看到旋钮的位置。
我怎样才能做到这一点?
注意:
给你(假设你使用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')
这个解决方案有点老套,我很乐意看到一个更优雅的解决方案。 演示:
使用 JupyterLab 0.32.1 在 Firefox 60 和 Chrome 67 中测试。
编辑让它成为细胞魔法,你可以简单地做:
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
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
如果只需要改变nbconvert
转换的单元格的颜色,
在您的文件夹中创建模板 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 %}
(改编自官方docs)
.. 然后将标签 "highlight" 添加到您的单元格。在 Jupyter 实验室中,您可以在左侧为选定的单元格执行此操作:
现在,使用模板使用 nbconvert 转换笔记本:
jupyter nbconvert --to html 'mynb.ipynb' --template=mytemplate.tpl
生成的 HTML 将如下所示:
我发现这适合向读者突出显示特定单元格。
以下是在 jupyter-notebook
(v6.3.0) 和 jupyter-nbconvert --to=html
(v6.0.7) 中对我有用的内容。
它与@krassowski 和@Gabe 的回答有两点不同:
交互式笔记本使用 class 名称
.cell
和.input_area
,但 nbconvert HTML 使用.jp-CodeCell
和.jp-Editor
和.highlight
。此代码处理所有这些。我更喜欢“线魔术”而不是“单元魔术”,因为线魔术不会改变单元格其余部分的计算。
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