Matplotlib widgets Slider Demo explicación del código fuente

Estoy tratando de entender el código fuente para poder usar los widgets Slider de matplotlib. La parte de código que define la función update() realmente me molesta:

No veo el punto de tener el argumento val en def update(val): y el valor de val no se menciona en ninguna parte. Es el mismo problema con la función def reset(event): . Algunas pruebas simples que he hecho hasta ahora:

  1. cambie el nombre del argumento val a otra palabra aleatoria, por ejemplo, def update(wtf): sin cambiar el cuerpo de la función. El código resultante sigue funcionando como se desea.
  2. Agregar algún valor predeterminado al argumento, por ejemplo, def update(wtf=None): sin cambiar el cuerpo de la función. El código resultante sigue funcionando como se desea.
  3. Simplemente quite el argumento. def update(): El control deslizante NO MÁS cambia la ttwig, lo que significa que el script no está funcionando.

No entiendo cómo funciona esta función de update o el argumento val . ¿Alguien puede explicar?

La on_changed llamada on_changed proporcionará el valor actual del control deslizante a la función. La función de update , por lo tanto, necesita un argumento. La razón por la que no se usa este argumento en el ejemplo es que la función de update necesita los valores de ambos controles deslizantes, independientemente de cuál se cambie, y por lo tanto toma los valores directamente de las instancias de Control deslizante.

Para comprender mejor cómo funciona el control deslizante, se puede considerar la siguiente versión simplificada:

 import numpy as np import matplotlib.pyplot as plt from matplotlib.widgets import Slider fig, ax = plt.subplots() plt.subplots_adjust(left=0.25, bottom=0.25) t = np.arange(0.0, 1.0, 0.001) s = np.sin(6*np.pi*t) l, = plt.plot(t, s, lw=2, color='red') plt.axis([0, 1, -1.2, 1.2]) axfreq = plt.axes([0.25, 0.1, 0.65, 0.03], facecolor="lightblue") sfreq = Slider(axfreq, 'Freq', 0.1, 20.0, valinit=3) def update(val): l.set_ydata(np.sin(2*np.pi*val*t)) fig.canvas.draw_idle() sfreq.on_changed(update) plt.show() 

Aquí solo tiene un control deslizante y el valor se pasa a la función de actualización, donde se utiliza para calcular nuevos valores de datos.

Muy sencillamente, la callback on_click del botón pasa un evento de clic a la función. Esto es bastante inútil en este caso, pero podría ser usado para ver, qué botón del mouse se ha usado, o dónde ha ocurrido exactamente el clic.

 def reset(event): if event.button == 1: sfreq.reset() samp.reset() else: print("Please use the left mouse button") button.on_clicked(reset) 

@Ding tiene razón. Al ir al enlace de implementación (con la secuencia lógica de la línea 435 | 411-> 425), se llama a la función de update con el valor actual del Control deslizante actualizado. El valor pasado, sin embargo, no se utiliza directamente. En su lugar, el valor actual del control deslizante se menciona directamente en la función de update definida por el usuario mediante una referencia de variable global.