raw_input и timeout

Я хочу сделать raw_input('Enter something: .') . Я хочу, чтобы он спал в течение 3 секунд, и если нет ввода, отмените приглашение и запустите оставшуюся часть кода. Затем код контуров и снова реализует raw_input . Я также хочу, чтобы он сломался, если пользователь вводит что-то вроде «q».

Существует простое решение, которое не использует потоки (по крайней мере, не явно): используйте select, чтобы знать, когда что-то нужно читать из 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..." 

Изменить [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 и кнопкой, чтобы они могли что-то ввести и нажать кнопку, если таймер закончится, окно tkinter закрывается и сообщает, что у них закончилось время. Я думаю, что большинство других решений этой проблемы не имеют окна, которое всплывает, поэтому мысль id добавляется в список 🙂

с raw_input () или input (), это невозможно, поскольку он останавливается в секции ввода, пока он не получит вход, затем он продолжает …

Я взял код из следующей ссылки: Создание таймера обратного отсчета с помощью Python и Tkinter?

Я использовал ответ Брайана Оукли на эту проблему и добавил входную панель и т. Д.

 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:

Ввод клавиатуры с тайм-аутом в Python

но вы, вероятно, этого не хотите …?

Для ответа rbp:

Для учета ввода, равного возврату каретки, просто добавьте вложенное условие:

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