raw_input y timeout

Quiero hacer un raw_input('Enter something: .') . Quiero que se duerma durante 3 segundos y, si no hay entrada, cancele la solicitud y ejecute el rest del código. Luego, el código realiza un bucle y vuelve a implementar el raw_input . También quiero que se rompa si el usuario ingresa algo como ‘q’.

Hay una solución fácil que no usa hilos (al menos no explícitamente): use select para saber cuándo hay algo que leer desde stdin:

 import sys from select import select timeout = 10 print "Enter something:", rlist, _, _ = select([sys.stdin], [], [], timeout) if rlist: s = sys.stdin.readline() print s else: print "No input. Moving on..." 

Edición [0]: aparentemente esto no funcionará en Windows , ya que la implementación subyacente de select () requiere un socket, y sys.stdin no lo es. Gracias por el heads-up, @Fookatchu.

Si está trabajando en Windows, puede intentar lo siguiente:

 import sys, time, msvcrt def readInput( caption, default, timeout = 5): start_time = time.time() sys.stdout.write('%s(%s):'%(caption, default)); input = '' while True: if msvcrt.kbhit(): chr = msvcrt.getche() if ord(chr) == 13: # enter_key break elif ord(chr) >= 32: #space_char input += chr if len(input) == 0 and (time.time() - start_time) > timeout: break print '' # needed to move to next line if len(input) > 0: return input else: return default # and some examples of usage ans = readInput('Please type a name', 'john') print 'The name is %s' % ans ans = readInput('Please enter a number', 10 ) print 'The number is %s' % ans 

Tengo un código que hace que una aplicación de cuenta regresiva con un cuadro de entrada y un botón tkinter para que puedan ingresar algo y presionar el botón, si el temporizador se acaba, la ventana de tkinter se cierra y les dice que se quedaron sin tiempo. Creo que la mayoría de las otras soluciones a este problema no tienen una ventana que se abre, así que id id para agregar a la lista 🙂

con raw_input () o input (), no es posible ya que se detiene en la sección de entrada, hasta que recibe la entrada, luego continúa …

He tomado algo de código del siguiente enlace: ¿ Hacer un temporizador de cuenta regresiva con Python y Tkinter?

Utilicé la respuesta de Brian Oakley a este problema y agregué el buzón de entrada, etc.

 import tkinter as tk class ExampleApp(tk.Tk): def __init__(self): tk.Tk.__init__(self) def well(): whatis = entrybox.get() if whatis == "": # Here you can check for what the input should be, eg letters only etc. print ("You didn't enter anything...") else: print ("AWESOME WORK DUDE") app.destroy() global label2 label2 = tk.Button(text = "quick, enter something and click here (the countdown timer is below)", command = well) label2.pack() entrybox = tk.Entry() entrybox.pack() self.label = tk.Label(self, text="", width=10) self.label.pack() self.remaining = 0 self.countdown(10) def countdown(self, remaining = None): if remaining is not None: self.remaining = remaining if self.remaining <= 0: app.destroy() print ("OUT OF TIME") else: self.label.configure(text="%d" % self.remaining) self.remaining = self.remaining - 1 self.after(1000, self.countdown) if __name__ == "__main__": app = ExampleApp() app.mainloop() 

Sé que lo que agregué fue un poco perezoso pero funciona y es solo un ejemplo

Este código funciona para Windows con Pyscripter 3.3

Para la respuesta de rbp:

Para tener en cuenta una entrada igual a un retorno de carro, simplemente agregue una condición anidada:

 if rlist: s = sys.stdin.readline() print s if s == '': s = pycreatordefaultvalue