zwiń komórkę w notatniku jupyter


143

Używam notebooka ipython Jupyter. Powiedzmy, że zdefiniowałem funkcję, która zajmuje dużo miejsca na moim ekranie. Czy istnieje sposób na zawalenie komórki?

Chcę, aby funkcja była nadal wykonywana i wywoływana, ale chcę ukryć / zwinąć komórkę, aby lepiej wizualizować notatnik. W jaki sposób mogę to zrobić?


30
Wow, to już 2017 rok i nie ma prostego rozwiązania
user1700890

31
2019 i wciąż liczę
Hardian Lawi

23
2020 ... (pierwszy!)
itzy

5
Ach, wstawię przypomnienie, żebym mógł być pierwszy w 2021 roku
nowicjusz

6
JupyterLab ma to od 2019 roku. Podświetl komórkę, a następnie kliknij niebieski pasek obok niej. Teraz zobaczysz to jako trzy kropki. Będzie szanowany, gdy zapiszesz i ponownie otworzysz później lub w innym miejscu. Istnieją dodatkowe funkcje i opcje, takie jak View> Collapse All Code, patrz tutaj i łącze tutaj .
Wayne

Odpowiedzi:


94

jupyter contrib nbextensionsPakiet Python zawiera kod składane rozszerzenie, które mogą być włączone w notesie. Kliknij link (Github), aby uzyskać dokumentację.

Aby zainstalować za pomocą wiersza poleceń:

pip install jupyter_contrib_nbextensions
jupyter contrib nbextension install --user

Aby ułatwić sobie życie w zarządzaniu nimi, polecam również jupyter nbextensions configuratorpakiet. Zapewnia to dodatkową kartę w interfejsie notebooka, z której można łatwo (de) aktywować wszystkie zainstalowane rozszerzenia.

Instalacja:

pip install jupyter_nbextensions_configurator
jupyter nbextensions_configurator enable --user

11
Fajne rzeczy, chociaż chciałbym, żeby nbextension „Codefolding” zwijał całe komórki, a nie tylko bloki kodu.
bsmith89

2
Jeśli ktoś napotka problemy z instalacją conda, spróbuj: pip install jupyter_contrib_nbextensionsthen jupyter contrib nbextensions install --sys-prefix --skip-running-check. Chciałbym, żeby jupyter miał domyślnie ten pakiet.
user1700890

7
Najprostsza ścieżka instalacji jest przez samego Conda : conda install -c conda-forge jupyter_contrib_nbextensions.
Max Ghenis

3
Tylko krótka notatka dla każdego, kto używa nowszego JupyterLab. Według wspomnianej witryny GitHub, te rozszerzenia działają w JupyterLab. Sam się nad tym zastanawiałem, więc pomyślałem, że dam znać innym. Cytowanie repo GitHub: Due to major differences between the Jupyter Notebook and JupyterLab, the extensions in this repository will not work in JupyterLab.
NYCeyes

2
MOŻESZ zwinąć całą komórkę, jeśli umieścisz #koment na górze komórki. Następnie Jupyter dostarcza rozwijaną strzałkę, która zwinie całą komórkę.
EatSleepCode

27

Możesz utworzyć komórkę i umieścić w niej następujący kod:

%%html
<style>
div.input {
    display:none;
}
</style>

Uruchomienie tej komórki spowoduje ukrycie wszystkich komórek wejściowych. Aby je pokazać, możesz użyć menu, aby wyczyścić wszystkie wyjścia.

W przeciwnym razie możesz wypróbować rozszerzenia notebooków, takie jak poniżej:

https://github.com/ipython-contrib/IPython-notebook-extensions/wiki/Home_3x


Rozszerzenia notebooków są naprawdę dobre. Jest też kilka innych rzeczy. github.com/ipython-contrib/jupyter_contrib_nbextensions
shahensha

27

JupyterLab obsługuje zwijanie komórek. Kliknięcie niebieskiego paska komórki po lewej stronie spowoduje zawinięcie komórki. wprowadź opis obrazu tutaj


6
nie
upiera się

Czy jest na to dobre rozwiązanie? Tak bardzo chcę ukryć zwinięte komórki podczas eksportu. Chcę zachować część kodu i część danych wyjściowych oraz ukryć inny kod i wyjście, więc nie mogę po prostu ukryć całego kodu .....
Russell Richie

2
Kod i dane wyjściowe można zwinąć, jak opisano w tej odpowiedzi. Ponadto informacje są utrwalane. Jest zapisany w metadanych komórki. source_hiddeni outputs_hiddenjest ustawiony. nbformat.readthedocs.io/en/latest/…
gillesB

16

Miałem podobny problem i "nbextensions" wskazane przez @Energya działały bardzo dobrze i bez wysiłku. Instrukcje instalacji są proste (próbowałem z anacondą w systemie Windows) dla rozszerzeń notebooka i ich konfiguratora .

To powiedziawszy, chciałbym dodać, że następujące rozszerzenia powinny być interesujące.

  • Ukryj wejście | To rozszerzenie umożliwia ukrycie pojedynczego kodekomórki w notebooku. Można to osiągnąć, klikając przycisk paska narzędzi: Ukryj dane wejściowe

  • Zwijane nagłówki | Umożliwia notatnikowi składanie sekcji oddzielonych nagłówkami Zwijane nagłówki

  • Składanie kodu | Zostało to wspomniane, ale dodam to dla kompletności Codefolding


9

Utwórz plik custom.js w ~ / .jupyter / custom / z następującą zawartością:

$("<style type='text/css'> .cell.code_cell.collapse { max-height:30px; overflow:hidden;} </style>").appendTo("head");
$('.prompt.input_prompt').on('click', function(event) {
    console.log("CLICKED", arguments)   
    var c = $(event.target.closest('.cell.code_cell'))
    if(c.hasClass('collapse')) {
        c.removeClass('collapse');
    } else {
        c.addClass('collapse');
    }
});

Po zapisaniu zrestartuj serwer i odśwież notatnik. Możesz zwinąć dowolną komórkę, klikając etykietę wejściową (W []).


3
To nie zadziałało, ponieważ zmieniany div nie jest ładowany, gdy wykonywany jest niestandardowy js. Można to jednak naprawić, opakowując wszystko w setTimeout (function () {...}, 3000);
Steohan

2
To zadziałało po zmianie czwartej linii na: var c = $(event.target).closest('.cell.code_cell') i po sugestii Steohana, aby zawinąć wszystko w setTimeout.
proteom

Możesz po prostu użyć c.toggleClass ('collapse'); zamiast instrukcji if-else.
gouravkr


9

Po pierwsze, postępuj zgodnie z instrukcjami Energya:

pip install jupyter_contrib_nbextensions
jupyter contrib nbextension install --user
pip install jupyter_nbextensions_configurator
jupyter nbextensions_configurator enable --user

Po drugie: po otwarciu notatnika jupiter kliknij kartę Nbextension. Teraz wyszukaj "colla" z narzędzia wyszukiwania dostarczonego przez Nbextension (nie przez przeglądarkę internetową) , a znajdziesz coś o nazwie "Zwijane nagłówki"

To jest to, czego chcesz!


2

Jak wspominali inni, możesz to zrobić za pomocą nbextensions. Chciałem krótko wyjaśnić, co zrobiłem, co było szybkie i łatwe:

Aby włączyć współpracujące nagłówki: W terminalu włącz / zainstaluj Jupyter Notebook Extensions, wprowadzając najpierw:

pip install jupyter_contrib_nbextensions

Następnie wprowadź:

jupyter contrib nbextension install

Ponownie otwórz notatnik Jupyter. Przejdź do zakładki „Edycja” i wybierz „Konfiguracja nbextensions”. Usuń zaznaczenie pola wyboru bezpośrednio pod tytułem „Konfigurowalne rozszerzenia nbezpłatne”, a następnie wybierz „zwijane nagłówki”.


Zastanawiasz się, dlaczego nie można uzyskać dostępu nbextensions configbezpośrednio z głównego pulpitu nawigacyjnego i zamiast tego należy otworzyć notatnik. Alternatywnie, jak wspominali inni, można uzyskać do niego dostęp przez localhost:8888/nbextensions(lub dowolny port w twojej konfiguracji)
Antoine

2

Jest wiele odpowiedzi na to pytanie, z których wszystkie uważam za niezadowalające (niektóre bardziej niż inne), spośród wielu rozszerzeń - zwijanie kodu, zwijanie według nagłówków itp. Żaden nie robi tego, co chcę w prosty i skuteczny sposób. Jestem dosłownie zdumiony, że rozwiązanie nie zostało wdrożone (tak jak w przypadku Jupyter Lab).

W rzeczywistości byłem tak niezadowolony, że opracowałem bardzo proste rozszerzenie do notebooka, które może rozszerzać / zwijać kod w komórce notebooka, zachowując jego wykonywalność.

Repozytorium GitHub: https://github.com/BenedictWilkinsAI/cellfolding

Poniżej znajduje się małe demo tego, co robi rozszerzenie:

Dwukrotne kliknięcie po lewej stronie komórki kodu zwinie ją do jednej linii:

Ponowne dwukrotne kliknięcie spowoduje rozwinięcie komórki.

Przedłużenie można łatwo zainstalować za pomocą pip:

pip install nbextension-cellfolding
jupyter nbextension install --py cellfolding --user
jupyter nbextension enable --py cellfolding --user 

i jest również kompatybilny z konfiguratorem nbextension . Mam nadzieję, że ludzie uznają to za przydatne!


2
Działał jak urok. Neat
Ayan Mitra

1

Istnieje również ulepszona wersja sugestii Pan Yan. Dodaje przycisk, który pokazuje z powrotem komórki kodu:

%%html
<style id=hide>div.input{display:none;}</style>
<button type="button" 
onclick="var myStyle = document.getElementById('hide').sheet;myStyle.insertRule('div.input{display:inherit !important;}', 0);">
Show inputs</button>

Lub python:

# Run me to hide code cells

from IPython.core.display import display, HTML
display(HTML(r"""<style id=hide>div.input{display:none;}</style><button type="button"onclick="var myStyle = document.getElementById('hide').sheet;myStyle.insertRule('div.input{display:inherit !important;}', 0);">Show inputs</button>"""))

2
Kody ukrywają WSZYSTKIE komórki wejściowe, a nie konkretną komórkę.
Jack Fleeting

Właśnie tego chciałem dla wyjścia, ale możesz zwinąć / ukryć wszystkie dane wyjściowe, przełączając je w menu Jupyter: Komórka> Wszystkie dane wyjściowe> Przełącz
oznaczanie

Szkoda, to jedyne rozwiązanie, które znalazłem, które domyślnie ukrywa kod i wyświetla go tylko po kliknięciu. Niestety, powoduje to ukrycie wszystkich komórek, a nie tylko jednej docelowej.
penelopa

@penelope możesz sprawdzić, czy różne komórki mają różne identyfikatory elementów html lub unikalne klasy. Jeśli tak, możesz odpowiednio zmodyfikować moją odpowiedź. Moja odpowiedź dotyczy wszystkich komórek, ponieważ nie różnicuje komórek.
Peter Zagubisalo

1

Nie musisz robić wiele poza włączaniem rozszerzeń:

http://localhost:8888/nbextensions?nbextension=collapsible_headings
http://localhost:8888/nbextensions?nbextension=codefolding/main

wprowadź opis obrazu tutaj

Najprawdopodobniej znajdziesz tutaj wszystkie swoje rozszerzenia:

http://localhost:8888/nbextensions

wprowadź opis obrazu tutaj


1

Aby uzyskać pożądany efekt, używam:

  1. Zapisz poniższy blok kodu w pliku o nazwie toggle_cell.pyw tym samym katalogu, co w Twoim notatniku
from IPython.core.display import display, HTML
toggle_code_str = '''
<form action="javascript:code_toggle()"><input type="submit" id="toggleButton" value="Show Sloution"></form>
'''

toggle_code_prepare_str = '''
    <script>
    function code_toggle() {
        if ($('div.cell.code_cell.rendered.selected div.input').css('display')!='none'){
            $('div.cell.code_cell.rendered.selected div.input').hide();
        } else {
            $('div.cell.code_cell.rendered.selected div.input').show();
        }
    }
    </script>

'''

display(HTML(toggle_code_prepare_str + toggle_code_str))

def hide_sloution():
    display(HTML(toggle_code_str))
  1. Dodaj następujący tekst w pierwszej komórce notatnika
from toggle_cell import toggle_code as hide_sloution
  1. Dowolna komórka, do której musisz dodać przycisk przełączania, aby po prostu zadzwonić hide_sloution()
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.