¿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)
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
deipywidgets
para crear un widget de actualización continua. Aquí tienes un código de ejemplo que implementa la interfaz de usuario deseada:En este código, la función
update_counter
se ejecuta continuamente con la funcióninteract
. La función comprueba el estado del checkboxpause
y actualiza el contadornumber
en consecuencia. La funcióntrigger_clicked
se llama cada vez que se hace clic en el botóntrigger
y decrementa el contador en 1.Ten en cuenta que utilizamos el widget
IntText
en lugar del widgetLabel
para el contador, para permitir valores actualizados.