Стандартный подход должен использовать выбор модуль.
Однако это не работает над Windows. Для этого можно использовать опрос клавиатуры msvcrt модуля.
Часто, это сделано с несколькими потоками - один для каждого устройства, "наблюдаемый" плюс фоновые процессы, которые, возможно, должны были бы быть прерваны устройством.
Хорошо, начиная с моей попытки отправить мое решение в неудавшемся комментарии, вот то, что я пытался сказать. Я мог сделать точно, что я хотел от собственного Python (в Windows, не где-либо еще хотя) со следующим кодом:
import msvcrt
def kbfunc():
x = msvcrt.kbhit()
if x:
ret = ord(msvcrt.getch())
else:
ret = 0
return ret
Вы могли бы посмотреть на то, как pygame обрабатывает это для кражи некоторых идей.
Из комментариев:
import msvcrt # built-in module
def kbfunc():
return ord(msvcrt.getch()) if msvcrt.kbhit() else 0
<час> спасибо за справку. Я закончил тем, что писал DLL C под названием PyKeyboardAccess.dll и получил доступ к crt conio функции, экспортировав эту стандартную программу:
#include <conio.h>
int kb_inkey () {
int rc;
int key;
key = _kbhit();
if (key == 0) {
rc = 0;
} else {
rc = _getch();
}
return rc;
}
И я получаю доступ к нему в Python с помощью ctypes модуля (встроенный в python 2.5):
import ctypes
import time
#
# first, load the DLL
#
try:
kblib = ctypes.CDLL("PyKeyboardAccess.dll")
except:
raise ("Error Loading PyKeyboardAccess.dll")
#
# now, find our function
#
try:
kbfunc = kblib.kb_inkey
except:
raise ("Could not find the kb_inkey function in the dll!")
#
# Ok, now let's demo the capability
#
while 1:
x = kbfunc()
if x != 0:
print "Got key: %d" % x
else:
time.sleep(.01)
import sys
import select
def heardEnter():
i,o,e = select.select([sys.stdin],[],[],0.0001)
for s in i:
if s == sys.stdin:
input = sys.stdin.readline()
return True
return False
Решение с использованием модуля curses. Печать числового значения, соответствующего каждой нажатой клавише:
import curses
def main(stdscr):
# do not wait for input when calling getch
stdscr.nodelay(1)
while True:
# get keyboard input, returns -1 if none available
c = stdscr.getch()
if c != -1:
# print numeric value
stdscr.addstr(str(c) + ' ')
stdscr.refresh()
# return curser to start position
stdscr.move(0, 0)
if __name__ == '__main__':
curses.wrapper(main)