raw_input和超时

我想做一个raw_input('Enter something: .') 。 我想让它睡3秒,如果没有input,则取消提示并运行代码的其余部分。 然后代码再循环并执行raw_input 。 如果用户input'q'之类的东西,我也希望它能够被打破。

有一个简单的解决scheme,不使用线程(至less不是明确的):使用select来知道什么时候从标准input读取某些内容:

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

编辑[0]:​​显然这不会在Windows上工作 ,因为select()的底层实现需要套接字,而sys.stdin不是。 感谢@Fookatchu的单挑。

如果您正在使用Windows,则可以尝试以下操作:

 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 

我有一些代码,使倒计时应用程序与tkinter的input框和button,使他们可以input的东西,并按下button,如果计时器用完tkinter窗口closures,并告诉他们,他们跑了时间。 我认为这个问题的大多数其他解决scheme没有popup窗口,所以认为id添加到列表:)

与raw_input()或input(),这是不可能的,因为它停止在input部分,直到它收到input,然后继续…

我已经从以下链接采取了一些代码: 使用Python和Tkinter倒数计时器?

我用布莱恩·奥克利的这个问题的答案,并添加了input框等

 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() 

我知道我添加的是有点懒,但它的作品,它只是一个例子

此代码适用于Windows与Pyscripter 3.3

在Unix上有很多方法可以做到这一点:

键盘input与Python超时

但你可能不想要那个…?

对于rbp的回答:

考虑input等于一个回车简单地添加一个嵌套的条件:

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