Цикл до нажатия клавиши python

Python — бесконечный цикл while, прерывание при вводе пользователем

У меня есть бесконечный цикл while, из которого я хочу выйти, когда пользователь нажимает клавишу. Обычно я использую raw_input , чтобы получить ответ пользователя; однако мне нужно raw_input не дожидаться ответа. Я хочу что-то вроде этого:

print 'Press enter to continue.' while True: # Do stuff # # User pressed enter, break out of loop 

Это должно быть просто, но я не могу понять это. Я склоняюсь к решению, используя потоки, но я бы предпочел не делать этого. Как я могу это сделать?

Этот поток может быть полезен (содержит рабочий пример с curses): ubuntuforums.org/showthread.php?t=1514035

@alKid, не совсем так. Я регистрирую данные для чего-то, что вручную запускается и заканчивается пользователем. Это то, что в настоящее время невозможно контролировать из моего сценария.

6 ответов

Я думаю, что вы можете сделать лучше с помощью msvcrt:

import msvcrt, time i = 0 while True: i = i + 1 if msvcrt.kbhit(): if msvcrt.getwche() == '\r': break time.sleep(0.1) print(i) 

К сожалению, все еще зависит от окна.

Вы можете использовать неблокирующее чтение из stdin:

import sys import os import fcntl import time fl = fcntl.fcntl(sys.stdin.fileno(), fcntl.F_GETFL) fcntl.fcntl(sys.stdin.fileno(), fcntl.F_SETFL, fl | os.O_NONBLOCK) while True: print("Waiting for user input") try: stdin = sys.stdin.read() if "\n" in stdin or "\r" in stdin: break except IOError: pass time.sleep(1) 

Следует отметить, что ваш ответ специфичен для Unix. Я лично на Windows, но этот код все еще хорошо иметь.

На python 3.5 вы можете использовать следующий код. Его можно настроить для конкретного нажатия клавиши. Цикл while будет продолжать работать до тех пор, пока пользователь не нажмет клавишу.

import time import threading # set global variable flag flag = 1 def normal(): global flag while flag==1: print('normal stuff') time.sleep(2) if flag==False: print('The while loop is now closing') def get_input(): global flag keystrk=input('Press a key \n') # thread doesn't continue until key is pressed print('You pressed: ', keystrk) flag=False print('flag is now:', flag) n=threading.Thread(target=normal) i=threading.Thread(target=get_input) n.start() i.start() 

Что вам нужно — это неблокирующий исходный ввод, если вы не хотите использовать потоки, есть простое решение, подобное этому ниже, где он выполняет тайм-аут в 20 мс, а затем поднимает и исключает, если пользователь не делает ‘t нажмите клавишу, если он это сделает, класс вернет нажатую клавишу.

import signal class AlarmException(Exception): pass def alarmHandler(signum, frame): raise AlarmException def nonBlockingRawInput(prompt='', timeout=20): signal.signal(signal.SIGALRM, alarmHandler) signal.alarm(timeout) try: text = raw_input(prompt) signal.alarm(0) return text except AlarmException: print '\nPrompt timeout. Continuing. ' signal.signal(signal.SIGALRM, signal.SIG_IGN) return '' 

Источник

Читайте также:  Random true or false python

Python — бесконечный цикл while, прерывание при вводе пользователем

У меня есть бесконечный цикл while, из которого я хочу выйти, когда пользователь нажимает клавишу. Обычно я использую raw_input , чтобы получить ответ пользователя; однако мне нужно raw_input не дожидаться ответа. Я хочу что-то вроде этого:

print 'Press enter to continue.' while True: # Do stuff # # User pressed enter, break out of loop 

Это должно быть просто, но я не могу понять это. Я склоняюсь к решению, используя потоки, но я бы предпочел не делать этого. Как я могу это сделать?

Этот поток может быть полезен (содержит рабочий пример с curses): ubuntuforums.org/showthread.php?t=1514035

@alKid, не совсем так. Я регистрирую данные для чего-то, что вручную запускается и заканчивается пользователем. Это то, что в настоящее время невозможно контролировать из моего сценария.

6 ответов

Я думаю, что вы можете сделать лучше с помощью msvcrt:

import msvcrt, time i = 0 while True: i = i + 1 if msvcrt.kbhit(): if msvcrt.getwche() == '\r': break time.sleep(0.1) print(i) 

К сожалению, все еще зависит от окна.

Вы можете использовать неблокирующее чтение из stdin:

import sys import os import fcntl import time fl = fcntl.fcntl(sys.stdin.fileno(), fcntl.F_GETFL) fcntl.fcntl(sys.stdin.fileno(), fcntl.F_SETFL, fl | os.O_NONBLOCK) while True: print("Waiting for user input") try: stdin = sys.stdin.read() if "\n" in stdin or "\r" in stdin: break except IOError: pass time.sleep(1) 

Следует отметить, что ваш ответ специфичен для Unix. Я лично на Windows, но этот код все еще хорошо иметь.

На python 3.5 вы можете использовать следующий код. Его можно настроить для конкретного нажатия клавиши. Цикл while будет продолжать работать до тех пор, пока пользователь не нажмет клавишу.

import time import threading # set global variable flag flag = 1 def normal(): global flag while flag==1: print('normal stuff') time.sleep(2) if flag==False: print('The while loop is now closing') def get_input(): global flag keystrk=input('Press a key \n') # thread doesn't continue until key is pressed print('You pressed: ', keystrk) flag=False print('flag is now:', flag) n=threading.Thread(target=normal) i=threading.Thread(target=get_input) n.start() i.start() 

Что вам нужно — это неблокирующий исходный ввод, если вы не хотите использовать потоки, есть простое решение, подобное этому ниже, где он выполняет тайм-аут в 20 мс, а затем поднимает и исключает, если пользователь не делает ‘t нажмите клавишу, если он это сделает, класс вернет нажатую клавишу.

import signal class AlarmException(Exception): pass def alarmHandler(signum, frame): raise AlarmException def nonBlockingRawInput(prompt='', timeout=20): signal.signal(signal.SIGALRM, alarmHandler) signal.alarm(timeout) try: text = raw_input(prompt) signal.alarm(0) return text except AlarmException: print '\nPrompt timeout. Continuing. ' signal.signal(signal.SIGALRM, signal.SIG_IGN) return '' 

Источник

Оцените статью