Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: SlayerBur en 14 Mayo 2021, 19:16 pm



Título: Verificar si paso x tiempo para realizar una accion
Publicado por: SlayerBur en 14 Mayo 2021, 19:16 pm
Buen día.

Estoy intentando hacer un código, y necesito que la persona no pueda realizar la misma acción, hasta que haya pasado 2 segundos (por ejemplo), pero a la vez, el programa debe continuar funcionando, por ende el sleep no me funcionaría :'(

Intente obteniendo los segundos actuales, y en una variable dentro del def, pero siempre me sumaría los 2 y nunca llegaría al tiempo

Código:
        time = datetime.datetime.now()
        tiempo = time.second + 2
        if time.second > tiempo:
            print('Texto')

eso es lo que tendría dentro de mi clase / def.
Intente colocar la variable en otro lado, pero siempre sería lo mismo, al intentar realizar la accion, volvería a sumar +2 al time.
no se si se comprende mi duda

Pd. Estoy utilizando pygame


Título: Re: Verificar si paso x tiempo para realizar una accion
Publicado por: engel lex en 14 Mayo 2021, 20:47 pm
Hola! asumo que esto es python3, no se que estás armando pero usualmente sería algo como

Código
  1. from time import time
  2. #....... codigo
  3. fin_bloqueo = time() + 2
  4. #.......
  5. if time() > fin_bloqueo:
  6.     hacer_algo()


Título: Re: Verificar si paso x tiempo para realizar una accion
Publicado por: SlayerBur en 14 Mayo 2021, 21:08 pm
Hola! asumo que esto es python3, no se que estás armando pero usualmente sería algo como

Código
  1. from time import time
  2. #....... codigo
  3. fin_bloqueo = time() + 2
  4. #.......
  5. if time() > fin_bloqueo:
  6.     hacer_algo()

Estoy intentando hacer un pequeño juego, y necesito que no se pueda pulsar / realizar una acción si se realizo previamente en un lapso de 2 segundos.


Título: Re: Verificar si paso x tiempo para realizar una accion
Publicado por: engel lex en 14 Mayo 2021, 21:28 pm
en ese caso puedes crear una bandera tipo


Código
  1. bloquear_inputs = False  #variable externa al ciclo
  2.  
  3.  
  4. #ciclo principal del juego
  5.  
  6.  if bloquear_inputs:
  7.    if time() > bloquear_inputs:
  8.      bloquear_inputs = False
  9.  else:
  10.    if input_usuario():
  11.      hacer_accion()
  12.  
  13.  # acción que causa bloqueo de inputs
  14.    bloquear_inputs = time() + 2
  15.  
  16.  

así si los inputs estan bloqueado se ve si es tiempo de desbloquear, en cualquier caso igual el ciclo sigue, pero no llega a "hacer_accion()", pero si no está bloqueado, entonces hace la acción.


espero esto te ayude y puedas ajustarlo a tu código...


sinceramente yo recomendaría para estas cosas hacer uso de multi hilos (threading) pero dependerá de que tan simple sea tu proyecto si eso vale la pena o no


Título: Re: Verificar si paso x tiempo para realizar una accion
Publicado por: DtxdF en 22 Mayo 2021, 20:06 pm
Hola @SlayerBur

Para ello debe ajustar una variable que indique el tiempo límite que desea esperar después de realizar una acción. Esto es para tener un mejor orden, pero también puede optar por crear un archivo de configuración (ya sea con ConfigParser, TOML, JSON, etc.), aunque esto se sale del tema, es más una recomendación para su proyecto.

Después de ajustar los segundos límites, también debe crear una variable donde hará referencia a el tiempo actual, el cual será usado para calcular los segundos transcurridos. Mucho después tiene que restar el tiempo actual con el tiempo que hace referencia esa variable, el cual le debería dar los segundos que han pasado.

El siguiente código es un pequeño script a modo de ilustración, y si mira la línea 20 puede ver que si es None, ejecutará la acción, hará la acción y ajustará el tiempo actual. Es necesario para cuando la operación que se desea todavía no se ha realizado.

Código
  1. #!/usr/local/bin/python3.7
  2.  
  3. import time
  4.  
  5. # El tiempo a esperar
  6. TIME_LIMIT = 5
  7. CURRENT_TIME = None
  8.  
  9. print("Escriba la tecla P y presione ENTER.")
  10. while (True):
  11.    try:
  12.        cmd = input("> ")
  13.    except (EOFError, KeyboardInterrupt):
  14.        break
  15.  
  16.    if not (cmd):
  17.        continue
  18.  
  19.    if (cmd[:1].lower() == "p"):
  20.        if (CURRENT_TIME is None or time.time()-CURRENT_TIME >= TIME_LIMIT):
  21.            print("Prueba")
  22.  
  23.            # Se reajusta el tiempo para poder realizar las mismas acciones
  24.            CURRENT_TIME = time.time()
  25.        else:
  26.            print("Debes esperar %d segundos..." % (TIME_LIMIT))
  27.    elif (cmd[:1].lower() == "q"):
  28.        break
  29.    else:
  30.        print("Error, comando inexistente")

Ejemplo:

Código
  1. python3.7 main.py

Resultado:

Código:
Escriba la tecla P y presione ENTER.
> p
Prueba
> p
Debes esperar 5 segundos...
>

Luego de esperar los 5 segundos, sucede la misma acción una y otra vez:

Código:
> Prueba

~ DtxdF