tkinter: hacer que un marco se esconda a la derecha con una animación suave de “desvanecimiento”
Hice un programa simple donde la ventana principal tiene un marco hideout
que se moverá lentamente fuera de la pantalla.
Pero no funciona.
import tkinter as tk
from tkinter import ttk
import time
root = tk.Tk()
root.geometry('360x640')
hideout = tk.Frame(root, background='#fff', width=360, height=640)
def inicial(*args):
for i in range(361):
time.sleep(0.01)
hideout.place(x=i, y=0)
root.after(0, inicial)
root.mainloop()
¿Qué está mal aquí?
davy.ai
Hay algunos problemas con este programa:
about
no parece estar definida: esto debería reemplazarse porhideout
, que es el nombre del marco que se está moviendo.initial
no está conectada al widget de marco: debería llamar al métodoplace
enhideout
, no enabout
.time.sleep
está bloqueando el hilo de la GUI, lo que impide que se muestren actualizaciones hasta que se complete el bucle. Esta no es la forma correcta de animar widgets en tkinter.Para solucionar estos problemas y crear una animación suave, se necesita un enfoque diferente. Una forma de lograr esto es usar el método
after
de la ventana principal para programar una serie de traducciones del widget de marco, con un pequeño retraso entre cada paso para permitir que la GUI se actualice. Aquí tienes un ejemplo:Esta versión del programa define una función recursiva
move_frame
que recibe un argumentostep
para indicar cuánto se debe mover el marco hacia la derecha. La función actualiza la coordenadax
del métodoplace_configure
dehideout
, luego programa otra llamada a sí misma después de un retraso de 10 milisegundos (ajustable según sea necesario).La animación comienza llamando a
move_frame
con un valor inicial destep
de 0 usandoroot.after
. Esto difiere la primera llamada a la función hasta que comienza el bucle principal, por lo que la GUI está completamente inicializada y lista para actualizar el marco.