2010-08-12 20 views
29

que quieren hacer un raw_input('Enter something: .'). Quiero que duerma durante 3 segundos y, si no hay entrada, cancélelo y ejecute el resto del código. Luego, el código realiza un bucle e implementa el raw_input nuevamente. También quiero que se rompa si el usuario ingresa algo como 'q'.raw_input y tiempo de espera

+0

relacionados: [Python 3 temporizadas de entrada/15528939] (https: // stackoverflow.com/questions/15528939/python-3-timed-input) – n611x007

+0

relacionados: [Tiempo de espera en un /492519](https://stackoverflow.com/questions/492519/timeout-on-a-python- función de Python llamada la función de llamada) – n611x007

+0

relacionados: [Cómo establecer límite de tiempo en /2933399](https://stackoverflow.com/questions/2933399/how-to-set-time-limit-on-input entrada) – n611x007

Respuesta

1

Hay muchas maneras de hacer esto en Unix:

Keyboard input with timeout in Python

pero es probable que no quiere que ...?

+0

necesito estar lejos de las señales. Las señales no puedo trabajar con mi programa porque tengo a tantas llamadas a otros scripts de Python y os.system comandos que no puedo llevar la cuenta de qué programa I "m. Necesito ser que el programa pide un usuario para una entrada y después de 3 segundos, si no hay entrada de proceder y luego hacer la pregunta otra vez. al final quiero que se ejecute siempre si hay tehre entrada. – ykmizu

47

Hay una solución fácil que no utiliza hilos (al menos no explícitamente): utilizar select saber cuando hay algo que se lee de la entrada estándar:

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..." 

Editar [0]: al parecer esta won't work on Windows, ya que la implementación subyacente de select() requiere un socket y sys.stdin no. Gracias por el aviso, @Fookatchu.

+0

no se puede utilizar esta causa mis computadoras de la compañía están utilizando 2.3.3 .. Gracias. – ykmizu

+1

El módulo 'select' está en python 2.3. – habnabit

+0

ykmizu: como señaló Aaron, el módulo de selección está disponible en Python 2.3.3: http://docs.python.org/release/2.3.3/lib/module-select.html – rbp

9

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 
+1

Esto funcionará bien desde la línea de comandos, pero no funcionará cuando se ejecute dentro de Eclipse, no estoy seguro de cómo obtener msvcrt leyendo el teclado desde dentro de Eclipse. – Paul

+1

Nunca utilicé Eclipse para Python, pero supongo que es lo mismo que sublimtext, la consola incorporada no es una implementación adecuada, solo una salida. Estoy seguro de que puede configurar Eclipse para que use un terminal o cmd real en ese caso, de modo que pueda ingresar datos en él. – erm3nda

+0

@Paul - esto no funciona para mí en Windows. Estoy ejecutando su código, literalmente, con la excepción de cambiar la sintaxis de Imprimir a py3 y agregar un stdout.flush(). Windows7, python3.6 – mike

1

Para la respuesta de RBP:

Para tener en cuenta de entrada igual a un retorno de carro sólo tiene que añadir una condición anidada:

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

tengo algo de código que hace que una aplicación de cuenta atrás con un cuadro de entrada tkinter y el botón para que puedan entrar en algo y pulsa el botón, si el tiempo llega a cero el viento tkinter ow cierra y les dice que se les acabó el tiempo. Creo que la mayoría de las otras soluciones a este problema no tienen una ventana que aparece, así que ID pensado agregar a la lista :)

con raw_input() o entrada(), no es posible porque se detiene en el sección de entrada, hasta que recibe la entrada, entonces se lleva a cabo ...

yo he tomado algo de código desde el siguiente enlace: Making a countdown timer with Python and Tkinter?

utilicé la respuesta de Brian Oakley a este problema y ha añadido la entrybox 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, e.g. 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é lo que he añadido era un poco flojo pero funciona y es sólo un ejemplo

Este código funciona para Windows con Pyscripter 3.3

Cuestiones relacionadas