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.

Temporizador de Python que no detiene todo el programa.

Estoy tratando de crear un modo para un juego simple en el que atrapas objetos mientras caen usando tkinter.

En este modo, tienes 60 segundos para atrapar la mayor cantidad de objetos posible. Todos los métodos de temporizador que he intentado pausan todo el programa.

…intenté usar una etiqueta vacía, pero el .after pausa todo el programa

timerlabel = tkinter.Label(text="")
def timer():
    global t, timerdisplay
    while t > 0:
        t -= 1
        timerlabel.after(1000)
        c.delete(timerdisplay)
        timerdisplay = c.create_text(200, 12, text=t)
        c.update()

¿Alguna idea de cómo hacer esto?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una solución podría ser usar el módulo time para hacer un seguimiento del tiempo transcurrido y actualizar la etiqueta del temporizador en consecuencia. Aquí tienes un ejemplo de implementación:

    import tkinter
    import time
    
    def catch_items_game():
        # crea la ventana tkinter y el lienzo para el juego
        window = tkinter.Tk()
        canvas = tkinter.Canvas(window, width=400, height=400)
        canvas.pack()
    
        # crea la etiqueta del temporizador y establece el texto inicial
        timer_label = tkinter.Label(text="Quedan 60 segundos")
        timer_label.pack()
    
        # inicializa las variables del juego
        t = 60
        score = 0
    
        # comienza el bucle del juego
        start_time = time.time()
        while time.time() - start_time < t:
            # genera un objeto que cae al azar
            # comprueba si el objeto es atrapado por el jugador
            # actualiza la puntuación y el lienzo
    
            # actualiza la etiqueta del temporizador
            tiempo_restante = int(t - (time.time() - start_time))
            timer_label.config(text=f"{tiempo_restante} segundos restantes")
            timer_label.update()
    
        # muestra la puntuación final y termina el juego
        final_score_label = tkinter.Label(text=f"Puntuación final: {score}")
        final_score_label.pack()
        window.mainloop()
    

    En esta implementación, el bucle while se ejecuta continuamente hasta que el tiempo transcurrido coincida con la duración deseada. Dentro del bucle, se generan objetos que caen y se actualiza la puntuación y el lienzo del jugador. La etiqueta del temporizador también se actualiza en cada iteración del bucle, utilizando el método config para establecer el texto de la etiqueta y el método update para actualizar la visualización de la etiqueta. Dado que la actualización del temporizador solo afecta a la etiqueta, no pausará todo el programa. Una vez que el bucle finaliza, se muestra la puntuación final y el juego termina.

Comments are closed.