raw_input and timeout [duplicate] raw_input and timeout [duplicate] python python

raw_input and timeout [duplicate]


There's an easy solution that doesn't use threads (at least not explicitly): use select to know when there's something to be read from stdin:

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

Edit[0]: apparently this won't work on Windows, since the underlying implementation of select() requires a socket, and sys.stdin isn't. Thanks for the heads-up, @Fookatchu.


If you're working on Windows you can try the following:

import sys, time, msvcrtdef 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 usageans = readInput('Please type a name', 'john') print 'The name is %s' % ansans = readInput('Please enter a number', 10 ) print 'The number is %s' % ans 


I have some code which makes a countdown app with a tkinter entry box and button so they can enter something and hit the button, if the timer runs out the tkinter window closes and tells them they ran out of time.I think most other solutions to this problem don't have a window which pops up so thought id add to the list :)

with raw_input() or input(), it isn't possible as it stops at the input section, until it receives input, then it carries on...

I have taken some code from the following link:Making a countdown timer with Python and Tkinter?

I used Brian Oakley's answer to this problem and added the entrybox etc.

import tkinter as tkclass 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()

I know what I added was a bit lazy but it works and it is an example only

This code works for Windows with Pyscripter 3.3