Aporte python: casi emular input() pero con tiempo de espera

Iniciado por tincopasan, 2 Agosto 2016, 03:31 AM

0 Miembros y 1 Visitante están viendo este tema.

tincopasan

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 (python) [Seleccionar]

#-*- coding:utf-8 -*-
import msvcrt
import time
def input_tiempo(aviso = ">>>",duracion=10): #aviso es el prompt y duración cuanto hay que esperar
   global nombre                              
   nombre=""
   print (aviso)    
   finaliza = time.time() + duracion        #cuando terminar de esperar
   while time.time()< finaliza:            
       if msvcrt.kbhit():                   #msvcrt está recontra documentado y hay cientos de ejemplos    
           letra= msvcrt.getche().decode('ASCII')
           if letra == "\r":                 #si el usuario presiona enter sigue normal   
               break
           else:
               nombre+= letra
#forma de uso          
q=input_tiempo("Escribe tu nombre: ")  #pongo lo que quiera y si no pongo duración es la que viene x defecto
if nombre != "":
   print("\nHola ¡¡ {} !!".format(nombre))
else:
   print("Hola desconocido")    

Saludos   

Poyoncio

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
Curso de ensamblador desde cero

tincopasan

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.

Eleкtro

#3
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!