es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo actualizar los valores de ipywidget mientras se ejecuta el código?

Quiero crear una interfaz de usuario simple en Jupyter notebook en la que:
1. Un contador “number” se incrementa cada segundo.
2. Si la casilla de verificación “pausa” está marcada, “number” no se incrementa.
3. Si se presiona el botón “trigger”, “number” se decrementa, sin importar el estado de pausa.

Hasta ahora he intentado algunas variantes del código de abajo, pero no funciona; parece que los valores de los widgets no se actualizan al ejecutar el bucle while. ¿Hay alguna manera de solucionarlo o de hacer esto de otra manera? ¡Gracias!

import ipywidgets as widgets
import time
from IPython.display import display, clear_output

btn = widgets.Button(description = "Trigger")
pause = widgets.Checkbox(value = False, description = "¿Pausado?")
number = widgets.Label("0")
wid = widgets.VBox([btn, number, pause])
display(wid)

def triggered(b):
    number.value = str(int(number.value) - 1)

btn.on_click(triggered)

while True:
    time.sleep(1)
    while (pause.value == True):
        time.sleep(3)
    number.value = str(int(number.value) + 1)
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema con el código es que el bucle while bloquea la actualización del cuaderno de notas a los valores del widget. Una forma de solucionar esto es utilizar la función interact de ipywidgets para crear un widget de actualización continua. Aquí tienes un código de ejemplo que implementa la interfaz de usuario deseada:

    import ipywidgets as widgets
    from IPython.display import display
    import time
    
    number = widgets.IntText(0, description='Counter:')
    pause = widgets.Checkbox(value=False, description='Paused?')
    trigger = widgets.Button(description='Trigger')
    widgets.VBox([number, pause, trigger])
    
    def update_counter(change):
        while True:
            if not pause.value:
                number.value += 1
            time.sleep(1)
    
    def trigger_clicked(_):
        number.value -= 1
    
    trigger.on_click(trigger_clicked)
    
    widgets.interact(update_counter, change=number);
    

    En este código, la función update_counter se ejecuta continuamente con la función interact. La función comprueba el estado del checkbox pause y actualiza el contador number en consecuencia. La función trigger_clicked se llama cada vez que se hace clic en el botón trigger y decrementa el contador en 1.

    Ten en cuenta que utilizamos el widget IntText en lugar del widget Label para el contador, para permitir valores actualizados.

Comments are closed.