Widget.interact, определяющий параметр внутри функции, не обновляет слайдер

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

Например:

import ipywidgets as widgets
init = True
def test(a):
    global init
    if init:
        a = 0.5       # would in practice need some processing
        init = False
    print(a)
    
widgets.interact(test, a = (0,2,.1))

Я знаю, как установить начальное значение виджета, установив параметр функции в определении:

import ipywidgets as widgets
init = True
def test(a=0.5):
    print(a)
    
widgets.interact(test, a = (0,2,.1))

но это не то, чего я пытаюсь достичь.

Наивный первый пример выше не делает то, что я хочу, но мне интересно, возможно ли вообще то, чего я пытаюсь достичь, концептуально. Ведь виджет - это не "индикатор", а "управление"... Другими словами, есть ли способ «переговорить» с виджетом и обновить его значение изнутри функции, которой он управляет?

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

Wayne 09.04.2024 05:28

Что я хотел сказать о первом примере, так это то, что, хотя он и устанавливает значение «a» равным 0,5 (что подтверждается оператором печати), ползунок остается заблокированным на медианном значении между 0 и 2, то есть 1. Я ищу способ обновить ползунок, чтобы он отражал начальное значение 0,5 (опять же, это начальное значение будет вычислено, поэтому его нельзя установить априори, как это сделано в примере 2). И нет, я не настроен использовать Interact().

smXplorer 09.04.2024 22:53

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

Wayne 10.04.2024 04:53
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Придерживаясь interact(), вы можете передать виджет, чтобы указать параметры, такие как начальное значение ползунка, как описано здесь и в документации ipywidgets для взаимодействия(), где это указано interact(f, x=widgets.IntSlider(min=-10, max=30, step=1, value=10));. Просто добавьте этот подход в свой фрагмент кода:

import ipywidgets as widgets
init = 0.5
def test(a):
    print(a)
    
widgets.interact(test, a = widgets.FloatSlider(min=0, max=2, step=0.1, value=init));

Это начнется с 0,5, а не с середины диапазона ползунка.

Это выше приближает к документации; однако на самом деле вы также можете установить начальное значение внутри функции. В этом примере я придерживаюсь вашего кода и не устанавливаю начальное значение в ползунке, но выполняю настройку внутри функции по вашему запросу. Ключом является доступ и установка атрибута value ползунка после назначения ему дескриптора, например:

import ipywidgets as widgets
init = True
slider = widgets.FloatSlider(min=0, max=2, step=0.1)
def test(a):
    global init
    if init:
        slider.value = 0.5
        init = False
    print(a)
    
widgets.interact(test, a = slider)

Иллюстрация ситуации, когда вы не знаете начальное значение, но тоже что-то делаете со значением.

Объединение вашего кода с моделированием ситуации, когда значение вначале определяется чем-то другим (априори не зная значения) здесь, где я выбираю случайное число в начале, дает следующее:

from ipywidgets import interact
import ipywidgets as widgets
import random
max_secret = 10
secret = random.randint(1, max_secret)

slider = widgets.IntSlider(
    value=secret,
    min=0,
    max= max_secret,
    step=1,
    description='Choose value:',
    disabled=False,
    continuous_update=False,
    orientation='horizontal',
    style= {'description_width': 'initial'},
    readout=True,
    readout_format='d'
)

def test_func(x):
    output.update(f"The current value is: {slider.value}          That value times 5 is {slider.value * 5}")

output = display(f"The starting value is: {slider.value}", display_id=True)

interact(test_func, x=slider);

И вариант этого подхода, более близкий к версии, где значение ползунка устанавливается в функции, указанной в заголовке:

from ipywidgets import interact
import ipywidgets as widgets
import random
max_secret = 10
secret = random.randint(1, max_secret)
init = True
slider = widgets.IntSlider(
    min=0,
    max= max_secret,
    step=1,
    description='Choose value:',
    disabled=False,
    continuous_update=False,
    orientation='horizontal',
    style= {'description_width': 'initial'},
    readout=True,
    readout_format='d'
)

def test_func(x):
    global init
    if init:
        slider.value = secret
        init = False
    output.update(f"The current value is: {slider.value}          That value times 5 is {slider.value * 5}")

output = display(f"The starting value is: {secret}", display_id=True)

interact(test_func, x=slider);

Замечательно. Спасибо, что нашли время написать это. Я определенно многому научился.

smXplorer 10.04.2024 17:46

Другие вопросы по теме