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.

(Python) Las figuras tkinter (con barra de color) se superponen cuando se usa el deslizador.

Para mi problema anterior en https://stackoverflow.com/questions/70530615/python-tkinter-figures-with-colorbar-overlap-when-using-slider-update (He añadido una recompensa a este problema):

Intenté resolverlo considerando la siguiente buena sugerencia:

https://stackoverflow.com/questions/62290179/tkinter-figure-with-colorbar-shrinks-every-time-its-displayed

Sin embargo, surgió un nuevo problema.
Reescribí la función update() de la siguiente manera:

def update(val):
    num_on_slider.append(slider_de.val)
    for ii in range(0,num):
        if num_on_slider[-1] == ii:
                global cbar    # <-------- nuevo
                if cbar:       # <-------- nuevo
                    cbar.remove()       # <-------- nuevo
                    con = ax.contourf(x,y,dfs[ii], levels = levels, cmap=cm.jet, alpha = 0.5, antialiased = True)
                    cbar = fig.colorbar(con,ax = ax)
                    ax.axis([1, 12, 1, 6])

No hay superposición; sin embargo, el gráfico no cambia cuando muevo el control deslizante.
Parece que la condición if cbar: bloquea la ejecución de la parte de código siguiente.

Pero en mi problema original, asigné cbar fuera de la función:

    cbar = fig.colorbar(con,ax = ax)
    ax.axis([1, 12, 1, 6])
    # ================================================Control deslizante==========================================
    global slider_de
    slider_bar = fig.add_axes([0.12, 0.1, 0.78, 0.03])     
    slider_de = Slider(slider_bar, 's_bar', 0, num-1, valinit=1,valfmt='%0.0f',  valstep=1)
    num_on_slider = []

    def update(val):
        num_on_slider.append(slider_de.val)
        for ii in range(0,num):
            if num_on_slider[-1] == ii:
                    global cbar
                    if cbar:
                        cbar.remove()
                        con = ax.contourf(x,y,dfs[ii], levels = levels, cmap=cm.jet, alpha = 0.5, antialiased = True)
                        cbar = fig.colorbar(con,ax = ax)
                        ax.axis([1, 12, 1, 6])

    slider_de.on_changed(update)

Por lo tanto, el valor de cbar no debería ser None.

¿Cómo solucionar el problema?

¡Gracias!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el valor de cbar no se está actualizando correctamente en la nueva función update(). Una forma de solucionar esto podría ser inicializar el valor de cbar fuera de la función update(), al igual que en el código original, y luego actualizarlo dentro del bucle en función del valor actual del slider.

    Aquí hay una versión actualizada de la función update() que debería funcionar:

    # inicializar cbar fuera de la función update
    cbar = None
    
    def update(val):
        num_on_slider.append(slider_de.val)
        for ii in range(0,num):
            if num_on_slider[-1] == ii:
                global cbar
                if cbar:
                    cbar.remove()
                con = ax.contourf(x,y,dfs[ii], levels = levels, cmap=cm.jet, alpha = 0.5, antialiased = True)
                cbar = fig.colorbar(con,ax = ax)
                ax.axis([1, 12, 1, 6])
    
    slider_de.on_changed(update)
    

    Al inicializar cbar fuera de la función, su valor persistirá entre las llamadas a update(). Luego, dentro del bucle, podemos actualizar cbar en función de si existe o no, y eliminarlo si es necesario antes de crear uno nuevo. Esto debería permitir que la figura se actualice correctamente a medida que mueves el slider.

Comments are closed.