Поймать односимвольный ввод в stdin при выводе в stdout в Python - PullRequest
2 голосов
/ 20 мая 2010

Я пишу простой двойной таймер на Python.(Я использую Linux, и это нужно только для запуска в моей системе.) Идея состоит в том, что скрипт имеет два отдельных таймера, один из которых работает в любой момент времени.Пользователь должен иметь возможность нажать кнопку, чтобы либо переключить таймер, либо приостановить оба.В настоящее время тестовый скрипт выглядит следующим образом:

now = datetime.datetime.now()
until = now + datetime.timedelta(minutes=2)
print now,
while now < until:
    print "\r",
    now = datetime.datetime.now()
    print now,
    sys.stdout.flush()
    # check stdin here
    time.sleep(0.1)

(я пропустил импорт в коде здесь.)

Это выводит текущее значение таймера в стандартный вывод каждые 0,1 секунды., перезаписывая предыдущее значение, когда это происходит.

У меня, однако, возникают проблемы с реализацией линии # check stdin here.В идеале пользователь должен просто нажимать, скажем, «p», и таймер будет приостановлен.На данный момент у меня есть это вместо time.sleep(0.1):

if select.select([sys.stdin],[],[],0.1)[0]:
    print sys.stdin.readline().strip()

..., которое работает, за исключением того, что требуется, чтобы пользователь нажал ввод для распознавания команды.Есть ли способ сделать это без необходимости нажатия Enter?

1 Ответ

2 голосов
/ 20 мая 2010

См. ТАК * вопрос и в этой статье .

Оба описывают либо опции для конкретной платформы, либо используют что-то вроде pygame.

Однако, если вам нужно кроссплатформенное решение, которое не требует каких-либо внешних зависимостей (например, pygame), я думаю, что вы также сможете сделать это через модуль потоков в стандартной библиотеке. (Дайте мне немного, и я попытаюсь что-то сделать, используя модуль потоков ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...