web-dev-qa-db-fra.com

Comment changer la couleur d'arrière-plan d'une seule cellule dans un cahier / jupyterlab jupyter?

Je conçois un bloc-notes afin que les variables qui pourraient être modifiées par l'utilisateur soient regroupées dans des cellules distinctes dans le bloc-notes. Je voudrais mettre en évidence ces cellules avec une couleur d'arrière-plan différente afin qu'il soit évident pour l'utilisateur où se trouvent les boutons.

Comment pourrais-je y parvenir?

NB: Cette question connexe concernait la mise en évidence du code statique (pour un manuel) et la réponse acceptée proposait de tout mettre commentaires de balisage. Dans mon cas, je veux que le code en surbrillance soit dans une cellule exécutable .

7
P-Gn

Voilà (en supposant que vous utilisez Python kernel):

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="{}">'.format(script)))

Ensuite, utilisez-le comme ceci:

set_background('honeydew')

La solution est un peu hacky, et je serais heureux d'en voir une plus élégante. Démo:

enter image description here

Testé dans Firefox 60 et Chrome 67 avec JupyterLab 0.32.1.

Modifier pour l'avoir comme magie cellulaire, vous pouvez simplement faire:

from IPython.core.magic import register_cell_magic

@register_cell_magic
def background(color, cell):
    set_background(color)

et l'utiliser comme:

%%background honeydew
my_important_param = 42
9
krassowski

Petit ajout au code de krassowski (a essayé de l'ajouter comme commentaire mais n'a pas pu faire fonctionner la mise en forme).

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)))

De cette façon, vous pouvez l'utiliser à la fois comme magie et avec un appel de fonction normal:

bgc('yellow')
bla = 'bla'*3

ou

%%bgc yellow
bla = 'bla'*3
1
Gabe

Si vous avez seulement besoin de changer la couleur des cellules converties avec nbconvert, créez un modèle mytemplate.tpl dans votre dossier et ajoutez:

{% 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 %}

(adapté de l'officiel docs )

.. puis ajoutez une balise "surlignage" à votre cellule. Dans le laboratoire Jupyter, vous pouvez le faire à gauche pour la cellule sélectionnée: enter image description here

Maintenant, convertissez le bloc-notes avec nbconvert en utilisant le modèle:

jupyter nbconvert --to html 'mynb.ipynb' --template=mytemplate.tpl

Le code HTML résultant ressemblera à ceci:

enter image description here

J'ai trouvé cela approprié pour mettre en évidence des cellules spécifiques aux lecteurs.

0
Alex