(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!
davy.ai
Parece que el valor de
cbar
no se está actualizando correctamente en la nueva funciónupdate()
. Una forma de solucionar esto podría ser inicializar el valor decbar
fuera de la funciónupdate()
, 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:Al inicializar
cbar
fuera de la función, su valor persistirá entre las llamadas aupdate()
. Luego, dentro del bucle, podemos actualizarcbar
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.