Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: tincopasan en 2 Agosto 2016, 03:31 am



Título: Aporte python: casi emular input() pero con tiempo de espera
Publicado por: tincopasan en 2 Agosto 2016, 03:31 am
Muchas veces me preguntan y veo que preguntan como continuar si hay un input() y el usuario no presiona ENTER,lo más correcto desde mi perspectiva es usar threads y semaforos, pero cuando digo eso la respuesta más común es: "¿pódes hacer el código?, no manejo threads", pues bien, cualquiera puede hacer el código, el tema es que la mayoría solo copia y pega sin aprender nada, entonces me parece mejor hacer un código que haga algo similar y muy fácil, ya que usa lo más común de python.
Otra cosa, solo trabajo sobre windows y python 3.x por lo que el funcionamiento en otros S.O o versiones anteriores de python (2.x) no me interesan ni probar.
Bueno así usaría una función para casi emular input y que se corte con tiempo, por supuesto hay muchas más formas de hacerlo, pero quizá este sea un puntapie de inicio para sus códigos(que espero posteen)
Está incompleto por supuesto, pero si funcional en lo simple.
Claro que todos sabemos que esto es por consola y que si fuese con tkinter sería mucho más simple y mejor.
Código
  1. #-*- coding:utf-8 -*-
  2. import msvcrt
  3. import time
  4. def input_tiempo(aviso = ">>>",duracion=10): #aviso es el prompt y duración cuanto hay que esperar
  5.    global nombre                              
  6.    nombre=""
  7.    print (aviso)    
  8.    finaliza = time.time() + duracion        #cuando terminar de esperar
  9.    while time.time()< finaliza:            
  10.        if msvcrt.kbhit():                   #msvcrt está recontra documentado y hay cientos de ejemplos    
  11.            letra= msvcrt.getche().decode('ASCII')
  12.            if letra == "\r":                 #si el usuario presiona enter sigue normal    
  13.                break
  14.            else:
  15.                nombre+= letra
  16. #forma de uso          
  17. q=input_tiempo("Escribe tu nombre: ")  #pongo lo que quiera y si no pongo duración es la que viene x defecto
  18. if nombre != "":
  19.    print("\nHola ¡¡ {} !!".format(nombre))
  20. else:
  21.    print("Hola desconocido")    
  22.  
Saludos   


Título: Re: Aporte python: casi emular input() pero con tiempo de espera
Publicado por: Poyoncio en 2 Agosto 2016, 23:06 pm
Vaya vaya, es muy ingenioso el codigo que has hecho, aunque no acabo de entender eso de un input al que no le dan enter, si me pudieras explicar mejor alguna aplicacion que se le podria dar igual me animo yo tambien a intentar algo parecido  ;D


Título: Re: Aporte python: casi emular input() pero con tiempo de espera
Publicado por: tincopasan en 3 Agosto 2016, 10:28 am
no conozco todas las aplicaciones que se le podría dar, porque eso depende de cada programador, pero en mi caso lo uso en 1) juegos conversacionales donde por ejemplo muestro: ¿que cable cortar? y si la respuesta es errada o paso el tiempo muestro: "perdiste la bomba explotó" o sea en juegos con tomas de decisiones por opciones y tiempo
2) test de conocimientos y velocidad de tipeo, muestro:"como se dice 'uno' en inglés" y debe escribir bien y rápido, sino es un punto menos y ¿por qué tiempo en cada pregunta en vez de un tiempo total? fácil por que no lleva lo mismo escribir "one" que "last week i saw movies" y evalúo por respuesta.
eso básicamente uso yo, pero obviamente siempre lo voy complicando en el código.
Claro que vos pódes usarlo en otra cosa que se ocurra! y postearlo de paso.


Título: Re: Aporte python: casi emular input() pero con tiempo de espera
Publicado por: Eleкtro en 3 Agosto 2016, 16:27 pm
Yo si que le veo utilidad, me parece una idea muy buena @Tincopasan, un snippet muy practico. Es lo mismo que el típico mensaje de texto (o messagebox) con tiempo de retraso, también con sus diversas utilidades.
Lo único que yo creo que le faltaría a tu código para ser todavía más perfecto, sería un texto advirtiendo del tiempo que falta para terminar, pero bueno, se entiende que el código que has proporcionado es solo un ejemplo didáctico.

PD: Me han entrado ganas de replicar esta funcionalidad en .NET, ¡te copio la idea! :P

Saludos!