Блокнот Jupyter не обновляется с изменением ipywidget - PullRequest
1 голос
/ 17 апреля 2020

Когда я обновляю свои виджеты, ничего не происходит. Я пытаюсь отобразить гистограмму и выбрать данные на основе входных данных виджетов. У меня есть небольшой массив данных из 600 строк. Каждая строка имеет M atk_dice, N def_dice, atk_tl bool и несколько других селекторов. Данные представляют собой список переменной длины, который будет гистограммой функции распределения вероятностей.

import plotly.graph_objects as go 
import pandas as pd
import numpy as np
from ipywidgets import widgets

atk_dice = widgets.IntSlider(
    value = 1.0,
    min = 1.0,
    max = 6.0,
    step = 1.0,
    description = 'Number of Attack Dice',
    continuous_update = False)

def_dice = widgets.IntSlider(
    value = 1.0,
    min = 1.0,
    max = 6.0,
    step = 1.0,
    description = 'Number of Defense Dice',
    continuous_update = False)

tgt_lk = widgets.Checkbox(
    description = 'Target Lock',
    value = False)

container = widgets.HBox(children = [atk_dice, def_dice, tgt_lk])

j = 1
row = df.iloc[j]
M = (row['M_atk_dice'])
mPhr = row.Phr
mhits = np.arange(M+1)
trace1 = go.Bar(x = mhits, y = mPhr, opacity= 0.8, name = 'pdf')
g = go.FigureWidget(data = [trace1], 
                    layout = go.Layout(
                        title = dict(text = 'PDF')
                    )
                   )


def response(change):
    M = 10
    x1 = np.arange(M+1)
    y1 = x1

    with g.batch_update():
        g.data[0].x = x1
        g.data[0].y = y1

atk_dice.observe(response, names = "All", type = "change")
def_dice.observe(response, names = "All", type = "change")
tgt_lk.observe(response, names = "All", type = "change")        

widgets.VBox([container, g])

Заранее спасибо.

1 Ответ

0 голосов
/ 17 апреля 2020

Когда вы создаете эти функции и взаимодействуете, я всегда пытаюсь начать с базовой c print функции. Наличие name='All' в вашем observe вызове неверно, ни одна из клавиш dict не соответствует name=All, поэтому ваша функция не запускается. Посмотрите на name s и type s, которые происходят с ползунка без каких-либо kwargs в вызове наблюдения:

import pandas as pd
import numpy as np
from ipywidgets import widgets

atk_dice = widgets.IntSlider(
    value = 1.0,
    min = 1.0,
    max = 6.0,
    step = 1.0,
    description = 'Number of Attack Dice',
    continuous_update = False)

def response(change):
    print(change)

atk_dice.observe(response)
atk_dice
{'name': '_property_lock', 'old': traitlets.Undefined, 'new': {'value': 2}, 'owner': IntSlider(value=1, continuous_update=False, description='Number of Attack Dice', max=6, min=1), 'type': 'change'}
{'name': 'value', 'old': 1, 'new': 2, 'owner': IntSlider(value=2, continuous_update=False, description='Number of Attack Dice', max=6, min=1), 'type': 'change'}
{'name': '_property_lock', 'old': {'value': 2}, 'new': {}, 'owner': IntSlider(value=2, continuous_update=False, description='Number of Attack Dice', max=6, min=1), 'type': 'change'}

Возможно, вы хотите atk_dice.observe(response, names = "value", type = "change").

...