Виджет вывода появляется за пределами виджета вкладки при использовании nbconvert в блокноте jupyter с ipywidgets

Я создал блокнот, который должен отображать графики в виджете вкладок. Насколько я понимаю, чтобы включить что-то вроде графиков в виджет вкладки, мне нужно обернуть его в виджет вывода. В самом ноутбуке он работает, но когда я конвертирую его в html через nbconvert, он дает неправильный вывод.

Виджеты, такие как ползунки, кнопки или текст, появляются внутри виджета вкладки там, где они должны, но когда я использую виджет вывода, чтобы поймать график (или даже некоторый текст из функции print ()), он появляется перед средой вкладки, которая сама тогда пуста .

Вот как это должно выглядеть с одним графиком на вкладке (работает в записной книжке): Графики во вкладках внутри блокнот

И вот как это выглядит после nbconvert (в html). Графики появляются перед вкладкой envorinment: Графики перед вкладками в html

Обратите внимание, что nbconvert включает в себя и другие виджеты, а также вкладки с другим контентом.

Это используемый код:

# Import libraries
import pandas as pd
import matplotlib.pyplot as plt
import ipywidgets as widgets
import numpy as np

# Generated data for plotting
data = pd.DataFrame()
for i in range(5):
    data[i] = np.random.normal(size = 50)

Теперь эта часть работает в записной книжке, но не в html, но, как вы увидите, похоже, она связана с виджетом вывода, поскольку я не работаю с графиками или печатным текстом.

# This does not work with plots
children = []
for i in range(data.shape[1]):
    out = widgets.Output()
    with out:
        fig, axes = plt.subplots()
        data[i].hist(ax = axes)
        plt.show()
    children.append(out)
tab = widgets.Tab()
tab.children = children
for i in range(len(children)):
    tab.set_title(i, "Plot " + str(i))
tab

# And this does not work with printed output
children = []
for i in range(5):
    out = widgets.Output()
    with out:
        print("This is text", i)
    children.append(out)
tab = widgets.Tab()
tab.children = children
for i in range(len(children)):
    tab.set_title(i, "Text " + str(i))
tab

Однако, если я использую другой тип виджета (например, текст), он правильно отображается в записной книжке и выводе html из nbconvert.

# This works with the Text widget
children = []
for i in range(5):
    out = widgets.Text(description="P"+str(i))
    children.append(out)
tab = widgets.Tab()
tab.children = children
for i in range(len(children)):
    tab.set_title(i, "Text " + str(i))
tab

Итак, могу ли я что-то изменить, чтобы это действительно работало? В конце концов, мне нужен способ отображения N графиков на N вкладках ...


person Benedikt    schedule 31.07.2019    source источник
comment
Использование метода наблюдения решило эту проблему для меня. stackoverflow.com/questions/56949504/   -  person frostbite    schedule 17.11.2019
comment
У меня такая же проблема. Я пробовал использовать nbconvert с --ExecutePreprocessor.store_widget_state=True, он сохраняет состояние, но вывод идет не в ту ячейку. Единственное решение прямо сейчас - открыть Jupyter Notebook и запустить его вручную, затем перейти в Виджеты ›Сохранить состояние виджета. Затем используйте nbconvert, который покажет результат там, где он должен быть. Я думаю, проблема в том, что у nbconvert нет JS-движка (по понятным причинам), поэтому делать то, что мы хотим, невозможно.   -  person danielfrg    schedule 20.12.2019
comment
Я сообщил о проблеме вверх по течению здесь   -  person Eric    schedule 24.02.2020


Ответы (1)


У меня такая же проблема. Обновление nbconvert (например, через pip install --upgrade nbconvert) решило эту проблему.

Цитата из https://github.com/jupyter/nbconvert/issues/923:

MSeal прокомментировал 07.09.2020:

Да, эта проблема была решена в jupyter / nbclient # 24 и nbclient ›= 0.4. 0 есть исправление. NBconvert 6.0 (который должен быть выпущен завтра) по умолчанию использует nbclient, и проблема в целом должна исчезнуть. Вы можете опробовать его в выпуске 6.0.0rc0 сегодня, если хотите.

person Kilian Batzner    schedule 03.11.2020