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