ipywidgets & Как оценить ответы в форме - PullRequest
2 голосов
/ 21 апреля 2020

Я хотел бы добавить форму в блокнот Jupyter. Чтобы сделать это, моя идея заключается в следующем:

  • Добавить виджет RaddioButtons
  • Добавить кнопку «Отправить ответ»
  • Добавить функцию для оценки ответа

Мой код:

import ipywidgets as widgets

selection = widgets.RadioButtons(
    options=['The color', 'The length', 'The slope'],
    value='The slope',
    description='',
    disabled=False
)

button = widgets.Button(
    description='Submit answer',
    disabled=False,
    button_style='', # 'success', 'info', 'warning', 'danger' or ''
)

def evalute(selection):

    if (selection == "The slope"):
        print("Correct!")
    else:
        print("Try again...")
# To reset the option value. However, I would like to avoid having a "default" value
        seleccion = "The color"       

boton.on_click(evaluate(selection.value))        

left_box = widgets.VBox([selection, button])
widgets.HBox([left_box])



Однако, это не работает должным образом. По двум причинам:

  • Я не хочу, чтобы значение по умолчанию
  • Я не хочу, чтобы метод «оценивать» выполнялся в начале. Это должно быть "on_change"

Не могли бы вы помочь мне с этим и "уточнить" мое неправильное представление?

enter image description here

Ответы [ 2 ]

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

Я нашел решение. Идея состоит в том, чтобы использовать функцию: "interactive_output" и удалить кнопку. Это не совсем так, как я хотел, но это работает для меня.

def evaluate(a):
    if (a != None):
        if (a == "The slope"):
            print("Correct!")
        else:
            print("Try again...")
    else:
        print("Waiting for an answer")


selector = widgets.RadioButtons(
    options=['The color', 'The length', 'The slope'],
    value=None,
    description='',
    disabled=False
)

#boton = widgets.Button(
#    description='Evaluar',
#    disabled=False,
#    button_style='', # 'success', 'info', 'warning', 'danger' or ''
#)

ui = widgets.VBox([selector])
out = widgets.interactive_output(evaluar, {'a': selector})

display(ui, out)

Output from the code

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

Спасибо за очень ясный пример кода.

1) Вы можете указать value = None для своих RadioButtons

2) При установке on_click для вашей кнопки просто дайте имя функции , на самом деле не вызывайте функцию. Вы передаете функцию как объект кнопке, которая будет вызываться при нажатии (мне потребовалось некоторое время, чтобы обдумать это).

Кнопка передаст себя функции evaluate , но виджет, который нас действительно волнует, это selector.

import ipywidgets as widgets

selector = widgets.RadioButtons(
    options=['The color', 'The length', 'The slope'],
    value=None,
    description='',
    disabled=False
)

button = widgets.Button(
    description='Submit answer',
    disabled=False,
    button_style='', # 'success', 'info', 'warning', 'danger' or ''
)

def evaluate(button):

    selection = selector.get_interact_value()

    if (selection == "The slope"):
        print("Correct!")
    else:
        print("Try again...")
# To reset the option value. However, I would like to avoid having a "default" value
        selector.value = None     

button.on_click(evaluate)        

left_box = widgets.VBox([selector, button])
widgets.HBox([left_box])
...