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.

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í?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Hay algunos problemas con este programa:

    1. La variable about no parece estar definida: esto debería reemplazarse por hideout, que es el nombre del marco que se está moviendo.
    2. La función initial no está conectada al widget de marco: debería llamar al método place en hideout, no en about.
    3. La función 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:

    import tkinter as tk
    
    root = tk.Tk()
    root.geometry('360x640')
    
    hideout = tk.Frame(root, background='#fff', width=360, height=640)
    hideout.place(x=0, y=0)
    
    def move_frame(step):
        hideout.place_configure(x=step)
        if step < 360:
            root.after(10, move_frame, step + 1)
    
    root.after(0, move_frame, 0)
    root.mainloop()
    

    Esta versión del programa define una función recursiva move_frame que recibe un argumento step para indicar cuánto se debe mover el marco hacia la derecha. La función actualiza la coordenada x del método place_configure de hideout, 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 de step de 0 usando root.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.

Comments are closed.